2014-02-23 1 views
1

클래스를 사용하여 배열 배열에 대해 void를 호출합니다. 이 무효는 아래의 코드와 같이 보이며 여러 가지 인수를 제공 할 수있는 charf에 대한 정의를 작성하려고합니다. 아래의 코드를 보면 어떤 수의 인수를 제공해야하는지 이유를 알 수 있습니다.C++에서 여러 개의 인수를 제공하는 함수를 만드는 방법은 무엇입니까?

void Player::drawOptions() 
{ 
    u32 _q; 
    const char *buffer; 
    char *_1 = optBuf[0], *_2 = optBuf[1], *_3 = optBuf[2], *_4 = optBuf[3], *_5 =  optBuf[4], *_6 = optBuf[5], *_7 = optBuf[6], *_8 = optBuf[7], *_9 = optBuf[8], *_10 =  optBuf[9], *_11 = optBuf[10], *_12 = optBuf[11], *_13 = optBuf[12], *_14 = optBuf[13], *_15  = optBuf[14], *_16 = optBuf[15], *_17 = optBuf[16], *_18 = optBuf[17]; 
    for(_q = 0; _q<17; _q++) 
    switch(_q) 
    { 
    case 1:buffer = charf("&s", _1);break; 
     case 2:buffer = charf("%s\n%s", _1, _2);break; 
     case 3:buffer = charf("%s\n%s\n%s", _1, _2, _3);break; 
     case 4:buffer = charf("%s\n%s\n%s\n%s", _1, _2, _3, _4);break; 
     case 5:buffer = charf("%s\n%s\n%s\n%s\n%s", _1, _2, _3, _4, _5);break; 
     case 6:buffer = charf("%s\n%s\n%s\n%s\n%s\n%s", _1, _2, _3, _4, _5,  _6);break; 
     case 7:buffer = charf("%s\n%s\n%s\n%s\n%s\n%s\n%s", _1, _2, _3, _4, _5, _6,  _7);break; 
     case 8:buffer = charf("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s", _1, _2, _3, _4, _5,  _6, _7, _8);break; 
     case 9:buffer = charf("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s", _1, _2, _3, _4,  _5, _6, _7, _8, _9);break; 
     case 10:buffer = charf("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s", _1, _2,  _3, _4, _5, _6, _7, _8, _9, _10);break; 
     case 11:buffer = charf("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s", _1,  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11);break; 
     case 12:buffer = charf("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s",  _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12);break; 
     case 13:buffer =  charf("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s", _1, _2, _3, _4, _5, _6, _7, _8,  _9, _10, _11, _12, _13);break; 
     case 14:buffer =  charf("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s", _1, _2, _3, _4, _5, _6, _7,  _8, _9, _10, _11, _12, _13, _14);break; 
     case 15:buffer =  charf("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s", _1, _2, _3, _4, _5, _6,  _7, _8, _9, _10, _11, _12, _13, _14, _15);break; 
     case 16:buffer =  charf("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s", _1, _2, _3, _4, _5,  _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16);break; 
     case 17:buffer =  charf("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s", _1, _2, _3, _4,  _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17);break; 
     case 18:buffer =  charf("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s", _1, _2, _3,  _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18);break; 
    } 
    menu.max = option; 
    _q = 0; 
    elems[OPTIONS]->elem.text = LocalizedString(buffer), 
    clearOptions(); 
} 

이 형식이 잘못 지정되어 있다는 것을 알고 있지만 여기에 입력 코드가 붙여진 곳을 붙여 넣었습니다. 여전히이 작업을 수행했습니다.

const char* charf(const char* optName, const char* optNum) 

그러나 optNum 1 (18)의 인수로부터 아무것도에 사용되는, 그래서 내가 어떻게 할 것 : 어쨌든, 나는 같은 것을 사용해야 알아? (http://en.cppreference.com/w/cpp/language/parameter_pack에서) 다음과 같이

+0

서명은 다음과 같아야합니다 :'const char * charf (const char * optName, ...);' –

+0

woa, 당신은'C++ '프로그래머보다 더 많이 보입니다. 다양한 템플릿을 확인하십시오. – user1095108

+0

난 그냥 문자열 스트림 또는 Boost.Format 같은 것을 사용하고 싶습니다. – chris

답변

0

당신은 당신의 charf 기능을 사용하여 C++ (11) 가변 인자 템플릿을 입력 할 수 있습니다

const char* charf(const char* optName) 
{ 
    //zero argument 
} 

template<typename T, typename... Targs> 
const char* charf(const char* optName, T value, Targs... Fargs)) // recursive variadic function 
{ 
    //handle value ... 
    //charf(optName+1, Fargs...); // recursive call 
} 

은이 기술을 사용 printf을 구현하는 예를 들어, http://en.cppreference.com/w/cpp/language/parameter_pack를 참조하십시오.

0

가변 인자 템플릿으로 탐구하지 않고 간단한 해결책 :

#include<cstdio> 

using namespace std; 

void charf(char* args[], int len){ 
    for (int i = 0; i < len; i++){ 
     printf("%s\n", args[i]); 
    } 
} 

int main(void){ 
    char* foo[]{ "hello", "my", "name", "is", "slim", "shady" }; 
    int size = 6; 
    charf(foo, size); 

    system("pause"); 
    return 0; 
} 
+0

나는이 방법이 간단하지 않다는 것을 주장 할 것이다. 왜냐하면 * 정확하게 * 사용하기 때문이다. 예를 들어,이 함수는 제공된 크기가 실제로 올바른지 여부를 확인할 방법이 없습니다.가변성 템플릿은 구현 자 측에서 약간 더 많은 작업을하지만 사용상의 문제에 빠지지 않습니다. –

0

을 감안할 때 (적어도 외관상으로) 모든 인수가 나는 일종의을 선택 거라고 생각, 같은 유형입니다 ... 중간 라인이 , 말하자면. 가변성 템플릿은 사용하기 쉽지만 비교적 구현하기 어렵습니다. 배열은 구현하기 쉽지만 올바르게 사용하는 것은 비교적 어렵습니다.

std::string charf(std::initializer_list<std::string> const &list) { 
    std::ostringstream buffer; 
    std::copy(list.begin(), list.end(), 
     infix_ostream_iterator<std::string>(buffer, "\n")); 
    return buffer.str(); 
} 

당신은 a question on CodeReview.SE에서 infix_ostream_iterator을 찾을 수 있습니다

다행히 std::initializer_list 모두 쉽게 쉽게 구현할 수 을 사용하는 것입니다.

사용과 같습니다

class charf { 
    std::ostringstream buffer; 
public: 
    charf(std::initializer_list<std::string> const &list) { 
     std::copy(list.begin(), list.end(), 
      infix_ostream_iterator<std::string>(buffer, "\n")); 
    } 
    operator std::string() const { 
     return buffer.str(); 
    } 
}; 

: 당신이 정말로 괄호 안에 괄호가 마음에 들지 않으면

std::string result = charf({ "1", "2", "3", "4", "5", "6" }); 

, 당신은이 같은 작은 클래스, 무언가로이 쓸 수 ...이 경우 사용법은 다음과 같을 것입니다 :

제쳐두고 : 두 경우 모두, (정상적으로) 18 개의 주장으로 제한된다. 모든 컴파일러에는 제한이있을 수 있지만 일반적인 경우에는 수백 가지 인수에 가까울 수 있습니다. 실용적인 관점에서 무제한으로 충분할 것입니다 (18 번을 선택했을 때 염두에 두었던 것 같아요.).

관련 문제