第二行汇编得很好,但第三行给了我一个错误
int (* const f)() = ff;
cout << typeid(replace<int (*)(), int, char>::type).name() << endl;
cout << typeid(replace<f, int, char>::type).name() << endl;
test.cpp:3:25: error: the value of ‘f’ is not usable in a constant expression
test.cpp:1:15: note: ‘f’ was not declared ‘constexpr’
test.cpp:3:37: error: template argument 1 is invalid
答案 0 :(得分:3)
仅当参数是非类型参数时,模板参数才可以是函数指针。但遗憾的是,C ++ 11甚至还没有允许使用各种常量表达式来计算模板参数。对于非类型指针或引用,只允许传递另一个模板参数的值或直接获取的函数或对象的地址,而不将其首先存储在const
/ constexpr
变量中
对于下一次C ++修订,很可能会解除此限制。
答案 1 :(得分:0)
您可以使用模板化界面而不是函数指针:
template<class T>
class IMyInterface{
public:
virtual void doSomething(const T& arg) =0;
};