模板函数作为模板参数,标准是什么?
假设你有下面的代码模板函数作为模板参数,标准是什么?
template<typename T,void (T::*m)(int)>
struct B{
void f(T* a,int x){
(a->*m)(x);
}
};
struct A{
template<typename X> void f(int){
}
void wrap(int i){
f<char>(i);
}
B<A,&A::f<char> > y;
};
int main(){
A a;
}
这个定义
B<A,&A::f<char> > y;
作品与海湾合作委员会,但不与Visual Studio 2010:
error C2440: 'specialization' : cannot convert from 'overloaded-function' to 'void (__thiscall A::*)(int)'
相反,
B<A,&f<char> > y;
适用于visual studio,但不适用于gcc。
注意B<A,&A::f<char> > y;
放置在主,即
int main(){
B<A,&A::f<char> > y;
}
作品VS为好。
IS B<A,&f<char> > y;
不是标准?有没有一种方法(除了包装模板函数)使两个编译器编译的东西?
=== EDIT ====
一种可能的,肮脏的解决方案是
#ifdef _WIN32
#define vsFix(a,b) b
#else
#define vsFix(a,b) a::b
#endif
B<A,&vsFix(A,f)<char> > y;
B<A,&f<char> > y;
IS不标准?
No. &f<char>
是指向函数的指针,而不是指向成员函数的指针。
有没有一种方法(除了包装模板功能),使两个编译器的东西编译?
是,通过固定的类型,并通过指向类型A的对象:
template<typename T,void (T::*m)(int)>
struct B{
void f(T* a,int x){
(a->*m)(x);
}
};
struct A{
template<typename X> void f(int){
}
void wrap(int i){
y.f(this, i);
}
B< A, &A::f<int> > y;
};
int main(){
A a;
a.wrap(5);
}
我想建议您检出std :: function并使用它来传递函数 – 2012-07-18 16:53:15
@BЈовић:这不能在VS 2010中编译,但我不知道编译函数是否真的是buggy然后 @ std'' OrgnlDave谢谢,这可能是一个很好的方向,虽然它会引入C++ 11,不是吗? – 2012-07-18 16:56:21
@FabioDallaLibera对不起,我还没有试过编译。上面的代码编译得很好。但如所暗示的,你可以使用lambdas和std :: function – 2012-07-18 18:57:40
只是为了读者的理智,你应该张贴的代码的实际块是编译/不中不同的编译器(也就是说,而不是说*'B > y;'放在'main'中用于VS,添加作为测试代码的一部分 – 2012-07-18 16:53:55