调用具有可变参数编号的模板函数指针

时间:2011-07-07 17:03:09

标签: c++ templates

我想编写一个用其参数调用另一个函数的函数。看看我希望它如何运作:

int sum(int a, int b) { return a + b }
int succ(int a)       { return a + 1 }
int size(char* str)   { return strlen(str) }

int call(???) { ??? }

int main() {
  cout << call(sum, 1, 2) << endl;
  cout << call(succ, 41) << endl;
  cout << call(size, "teste") << endl;
}

预期产出:

3
42
5

如何编写call函数(假设返回值始终相同)?我能想到的唯一方法是:

template<typename T> int call(T func, int a, int b) { return func(a, b) } 
template<typename T> int call(T func, int a)        { return func(a) } 
template<typename T> int call(T func, char* a)      { return func(a) } 

有没有办法用模板va_list或其他任何东西来解决这种重复?

意向:

用于绘制几何图片,使用要绘制的参数方程解析函数。例如:

Vector2i circle(float t, float radius) {
  return Vector2i(cos(t * 2*PI) * radius, sin(t * 2*PI) * radius);
}
// ...
draw(circle, 10);

函数circle将在draw内使用不同t s(0.01.0之间)多次调用。绘制的其他参数直接发送到函数,10将是radius。 (Vector2i是一个自定义类)。

3 个答案:

答案 0 :(得分:21)

C ++ 0x可变参数模板:

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

答案 1 :(得分:3)

添加另一个模板变量:

template<typename T, typename U> 
int call(T func, U a) { return func(a) } 

template<typename T, typename U, typename V> 
int call(T func, U a, V b) { return func(a,b) }

答案 2 :(得分:2)

当前C ++解决方案的简单#define如何:

#define call(FUNC, ...) FUNC(__VA_ARGS__)

这是the demo。我建议您在使用call时使用更好的名称,然后使用#define这样的通用名称。