C++ MSVC抱怨函数指针不是编译时常量
我试图获取一些最初使用GCC构建的代码,以便使用MSVC进行编译,但代码中的回调包装器类遇到了问题。我提取了下面代码的关键部分:C++ MSVC抱怨函数指针不是编译时常量,c++,visual-c++,C++,Visual C++,我试图获取一些最初使用GCC构建的代码,以便使用MSVC进行编译,但代码中的回调包装器类遇到了问题。我提取了下面代码的关键部分: template <typename T_func> struct internal_parameter_resolver; template <typename R> struct internal_parameter_resolver<R()> { typedef R(*type)(); }; template &l
template <typename T_func>
struct internal_parameter_resolver;
template <typename R>
struct internal_parameter_resolver<R()> {
typedef R(*type)();
};
template <typename R, typename P1>
struct internal_parameter_resolver<R(P1)> {
typedef R(*type)(P1);
};
template <typename T_func, typename internal_parameter_resolver<T_func>::type func>
void bind() {
// Create and return instance of class Callback...
}
double func1() { return 0.5; }
int func2(double i) { return 0; }
int main() {
bind<double(), &func1>(); // (Line 23)
bind<int(double), &func2>(); // (Line 24)
return 0;
}
有人知道为什么MSVC认为那些函数指针不是编译时常量吗?或者问题在代码的其他地方(即,不是第23行和第24行)?如果它是编译器中的一个bug,我将欢迎任何关于可能的解决方法的建议
谢谢 模板
template <typename T_func, T_func* >
void bind() {
// Create and return instance of class Callback...
}
无效绑定(){
//创建并返回类回调的实例。。。
}
Visual C++不利于解决间接类型定义,但它更适合于更具体的类型,如上面的。
以上说明了用VisualC++ ++对直接问题的处理。 但是,更好的设计是使用自动模板参数推断:
template <typename T_func >
void bind( T_func const func ) {
// Create and return instance of class Callback...
}
double func1() { return 0.5; }
int func2(double i) { return 0; }
int main() {
bind( func1 ); // (Line 23)
bind( func2 ); // (Line 24)
}
模板
无效绑定(T_func const func){
//创建并返回类回调的实例。。。
}
double func1(){return 0.5;}
int func2(双i){返回0;}
int main(){
绑定(func1);/(第23行)
绑定(func2);/(第24行)
}
如果需要,您可以从
std::function
获取函数结果类型,依此类推。我认为没有任何理由将func1
和func2
作为非类型模板参数传递
最好将它们作为参数(而不是模板参数)传递,并让内部参数\u解析器
trait推断其类型:
template <typename T_func>
struct internal_parameter_resolver;
template <typename R>
struct internal_parameter_resolver<R()> {
typedef R(*type)();
};
template <typename R, typename P1>
struct internal_parameter_resolver<R(P1)> {
typedef R(*type)(P1);
};
template <typename T_func>
void bind(typename internal_parameter_resolver<T_func>::type func) {
// Create and return instance of class Callback...
}
double func1() { return 0.5; }
int func2(double i) { return 0; }
int main() {
bind<double()>(func1); // (Line 23)
bind<int(double)>(func2); // (Line 24)
return 0;
}
模板
结构内部参数分解器;
模板
结构内部参数解析程序{
类型定义R(*类型)();
};
模板
结构内部参数解析程序{
类型定义R(*类型)(P1);
};
模板
无效绑定(类型名称内部参数解析程序::类型func){
//创建并返回类回调的实例。。。
}
double func1(){return 0.5;}
int func2(双i){返回0;}
int main(){
绑定(func1);/(第23行)
绑定(func2);/(第24行)
返回0;
}
我手头没有VC,但应该可以编译。使用gcc 4.6和&clang 3.1编译得很好。@mfontanini是的,我知道,是MSVC给我带来了问题。哇,它真的很简单(使用t_func*)!不幸的是,我不能使用自动模板参数推断,因为回调类的实例化需要函数指针作为模板参数。谢谢感谢您的建议,不幸的是,回调类的实例化要求函数指针是模板参数(它基于中描述的轻量级回调)。
template <typename T_func>
struct internal_parameter_resolver;
template <typename R>
struct internal_parameter_resolver<R()> {
typedef R(*type)();
};
template <typename R, typename P1>
struct internal_parameter_resolver<R(P1)> {
typedef R(*type)(P1);
};
template <typename T_func>
void bind(typename internal_parameter_resolver<T_func>::type func) {
// Create and return instance of class Callback...
}
double func1() { return 0.5; }
int func2(double i) { return 0; }
int main() {
bind<double()>(func1); // (Line 23)
bind<int(double)>(func2); // (Line 24)
return 0;
}