我希望编写一个函数,可以使用其它函数及其参数。以下是我的期望操作方式:
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);
在draw
函数内,将会多次调用circle
函数并传入不同的t
参数(介于0.0
和1.0
之间)。其他的参数将直接传递给函数,10
将作为radius
参数。(其中Vector2i是自定义类)
boost :: bind
(在0x中使用std :: bind
),永远不要使用va_list
,它是不安全、麻烦的垃圾代码。 - Cat Plus PlusVector2i circle(float t, float r) {return Vector2i(cos(t*2*PI)*r, sin(t*2*PI)*r)};
然后draw(circle, 10)
,其中该函数将被多次调用,使用不同的t
值(在0.0
和1.0
之间),而10
则为r
的值。(Vector2i
是自定义类) - Guilherme Bernal