使用Variadic模板函数调用字符串参数c ++的正确方法

时间:2014-12-31 09:28:16

标签: c++ c++11

你好,我在这里通过字符串使用variadic模板做了什么错误? 如何正确使用它来完成以下任务?

#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 *)(char *)':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

1 个答案:

答案 0 :(得分:3)

问题是:

致电时:

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

模板化函数CallFunctionfuncanme={}实例化(完全没用,你可以删除它)和Args={int, int, int, int}。在此功能中,您有一行:MainCall(strcopy, args...);,在这种情况下变为:MainCall(strcopy, 1, 2, 3, 4),然后调用strcopy(1, 2, 3, 4)这是无效的通话。

C ++中没有(非复杂的)方法可以根据运行时已知的名称调用具有不同原型的函数并采用可变参数包。