我们都知道,c++ 用模版,可以根据不同的对象类型,生成不同的实际函数,但是,如果我想根据不同的条件,在一个模版类里面,调用不同的函数呢,能不能这样写
#include <iostream> using namespace std; void PrintA(int a) { cout<<a<<endl; } void PrintB(int b) { cout<<b<<endl; } template<class F, class V> void Call(V i) { F(i); } int main() { Call<PrintA, int>(1); Call<PrintB, int>(2); return 0; }
遗憾的是,这东西连编译都编译不过,上网查了一下,也没发现有类似的讨论。。
查了一下,发现这里有讨论,http://stackoverflow.com/questions/1174169/function-passed-as-template-argument
又想到其实这种情况,传个函数指针就能满足大部分要求了
C++的作法是用“函数对象”,重写()操作符.
class PrintA
{
public:
void operator()(int a)
{
cout<<a<<endl;
}
};
call函数的模板里再稍微改一下:
F f; // 实例化函数对象
f(i);
大多数情况下,不用C++模块能把代码写得更干净.
嗯,还是用函数指针比较好,而且够用