using namespace std;
float test1(float i){
return i * i;
}
int test2(int i){
return i+9;
}
struct Wrapper{
typedef void (*wrapper_type)(int);
template<class R, class A>
void wrap(string name,R (*fn) (A)){
wrapper_type f_ = &Wrapper::wrapper1<R,A,fn>;
// in the real program, f_ would be passed in an array to some c library
wrappers[name] = f_;
}
void run(int i){
map<string,wrapper_type>::iterator it, end = wrappers.end();
for(it=wrappers.begin();it!=end;it++){
wrapper_type wt = (*it).second;
(*wt)(i);
}
}
template<class R, class A, R (*fn) (A)>
static void wrapper1(int mul){
//do something
A arg = mul;
R result = (*fn)(arg);
cout << "Result: " << result << endl;
}
map<string,wrapper_type> wrappers;
};
int main(int argc, char** argv) {
Wrapper w;
w.wrap("test1",&test1);
w.wrap("test2",&test2);
w.run(89);
return 0;
}
这里的G ++错误:C++:如何通过函数指针,保存在一个局部变量,作为模板参数
main.cpp:31: error: ‘fn’ is not a valid template argument for type ‘float (*)(float)’ because function ‘fn’ has not external linkage
从我个人理解,这个问题是一个局部变量无连锁;因此它不能用作模板参数。
所以,我想知道是否有办法解决这个问题或其他技术来完成相同的?
谢谢。
编辑1:
我完全理解,我无法通过不能在编译时作为模板放慢参数来确定的值。我问的是 - 有没有更好的方法来做到这一点?现在,对我的作品的解决办法是:
template<class R, class A,R (*fn) (A)>
void wrap(string name){
wrapper_type f_ = &Wrapper::wrapper1<R,A,fn>;
// in the real program, f_ would be passed in an array to sm c library
wrappers[name] = f_;
}
,并呼吁为:
w.wrap<float, float, &test1>("test1");
w.wrap<int, int, &test2>("test2");
但在这里,我包裹中传递的参数类型。有没有办法避免这种情况?
编辑2:
只是为了澄清或添加更多的信息:我想呈现给用户的界面具有类似于LuaBind或Boost.Python的即Wrapper.wrap(“测试1”,&测试1) ;应该足够了。
什么时候知道指针指向哪个函数 - 在运行时还是编译时? – sharptooth 2011-05-18 08:04:35
在链接时... – hirschhornsalz 2011-05-18 08:10:56