2014-12-31 6 views
0

안녕하세요 Iam은 string을 통해 가변 템플릿을 사용하면서 여기서 무엇을하고 있습니까? 아래 작업을 수행하기 위해 올바르게 사용하는 방법?올바른 방법 Variadic 템플릿 함수 호출을 사용하여 문자열 인수 C++

#include <iostream> 
#include<string> 

int sum(int a, int b, int c, int d) { return a+b+c+d; } 
int strcopy(char* str) { strcpy(str,"Hello World!!!"); return 1; } 

template<typename Func, typename... Args> 
auto MainCall(Func func, Args&&... args)-> typename std::result_of<Func(Args...)>::type 
{ 
    return func(std::forward<Args>(args)...); 
} 

template<typename... funcname, typename... Args> 
int CallFunction(std::string const& Func , Args&&... args) 
{ 

    if(!Func.compare("sum")) 
    { 
     return MainCall(sum, args...); 
    } 
    else if(!Func.compare("strcopy")) 
    { 
     return MainCall(strcopy, args...); 
    } 
    else 
    { 
     return 0; 
    } 

} 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    char buffer[512]; 
    cout << CallFunction("sum",1,2,3,4) << end1; /* How to properly execute "sum" function by sending string name to variadic function template function??? */ 
    CallFunction("strcopy",buffer); /* How to properly execute "strcopy" function by sending string name to variadic function template function??? */ 
    printf("Buffer says = %s" , buffer); /* Should print "Hello World!!!" */ 
    getchar(); 
    return 0; 
} 

내가 할
오류 C2197과 같은 컴파일러 오류 : 'INT (__cdecl *) (숯불 *)'Maincall 너무 많은 인수
see reference to class template instantiation 'std::_Result_type<false,_Fty,_V0_t,_V0_t,_V2_t,_V2_t,_V4_t,_V4_t,_V6_t,_V6_t,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>' being compiled

+0

다시 묻는 대신 이전 질문을 개선하십시오. –

+0

나는 C++이 아니기 때문에 아마 예상 했겠지만'MainCall '에 대한 호출이 보이지 않습니다. 또한 아무 것도 제거 할 때까지 아무 것도 제거하지 않으면 버그가 사라집니다. 즉 "sum"에 대한 호출을 제거 할 때 여전히 발생합니까? printf? getchar() ... 등등. 문제를 재현하려면 꼭 필요한 코드 만 있으면됩니다. – franssu

+0

이것은 [this]와 완전히 다른 질문입니다 (http://stackoverflow.com/questions/27701828/how-to-pass-variable-arguments-to-variadic-template-function-in-a-right-way-c) ... 여기에 문자열을 사용하고 함수를 호출하여 variadic 템플릿을 사용하는 방법을 알고 싶습니다. 예 !!! 나는 내가 게시 한 답변을 얻지 못했기 때문에 새로운 질문이 올랐다. – Lo1234

답변

3

문제는 :

전화 할 때 :

CallFunction("sum", 1, 2, 3, 4) 

템플릿 기능 CallFunctionfuncanme={} (완전히 쓸모 없으며 제거 할 수 있음) 및 Args={int, int, int, int}으로 인스턴스화됩니다. 이 함수에는 줄이 있습니다 : 이 차례로 strcopy(1, 2, 3, 4)을 호출하여 잘못된 호출입니다.이 경우 MainCall(strcopy, args...);이됩니다.

런타임시 알려진 이름을 기반으로하고 가변 인수 팩을 사용하여 다른 프로토 타입으로 함수를 호출하는 C++에는 (비 복잡한) 방법이 없습니다.

+0

고맙습니다 ..이 개념을 달성하기 위해 이와 비슷한 방법이 있습니까? – Lo1234

+0

@ Lo1234 문자열을 id에 매핑하고 각 id/prototype에 대한 특수한 템플릿을 갖는'constexpr' 함수를 사용하여 뭔가 할 수 있다고 생각합니다.하지만 그렇게해도 (매우있을 법하지 않음) 너무 복잡하고 내가 실제적인 이점을 보지 못하는 것을 위해 너무 많은 번거 로움. 함수 포인터가 아니라 함수 이름 (문자열)을 사용합니다. – bolov

관련 문제