我想编写一个用其参数调用另一个函数的函数。看看我希望它如何运作:
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.0
和1.0
之间)多次调用。绘制的其他参数直接发送到函数,10
将是radius
。 (Vector2i是一个自定义类)。
答案 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
这样的通用名称。