【发布时间】:2011-12-19 15:33:59
【问题描述】:
我一直在编写一些希望通过 boost::function 传递的模板。他们确定 boost::function 的参数,然后使用它来创建一个适当的类特化。例如,这是 0 个参数的模板:
template< class ReturnT >
MyFunctionPtr MakeFunction( boost::function< ReturnT ( ) > func )
{
return MyFunctionPtr( new MyFunction< decltype( func ), ReturnT >( func ) );
}
作为一个捷径,我有另一个版本的 MakeFunction 模板,它接受一个函数指针并自动将它包装在适当类型的 boost::function 中:
template< class T >
MyFunctionPtr MakeFunctionFromPointer( T func )
{
return MakeFunction(
boost::function< typename boost::remove_pointer<T>::type >( func )
);
}
这允许我从函数指针创建而无需显式传递函数规范:
int something() { return 1; }
MakeFunctionFromPointer( &something );
在 MSVC 上这工作正常,但在 GCC 4.3 中我得到“无匹配函数”错误。看来:
在 MSVC 上 boost::remove_pointer< bool (*)() >::type 是 bool ()
但在 GCC 4.3 上:boost::remove_pointer< bool (*)() >::type 是 bool ()()
所以在 GCC 上不存在 MakeFunction 的适当模板。
有什么方法可以改变任一平台上 remove_pointer 输出的输出以匹配另一个?或者有没有其他方法可以解决这个问题?
【问题讨论】:
-
也许可以试试
boost::decay而不是remove_pointer... -
@KerrekSB 这似乎导致
bool (*)(),boost::function不接受。 -
template <typename T> MakeFunctionFromPointer(T(*f)()) { return boost::function<T()>(f); }怎么样? -
@KerrekSB 是的,这行得通。我希望避免必须为每个不同数量的参数定义重载,但我猜这可能是不可避免的。如果您将此作为答案,如果没有更好的结果,我会接受。
-
嗯,一般来说你可以使用可变参数模板...
标签: c++ templates visual-c++ gcc boost