c++ - 从函数指针创建 boost::function 的跨平台方式

标签 c++ templates visual-c++ gcc boost

我一直在编写一些模板,希望通过 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 (*)() >::typebool ()

但是在 GCC 4.3 上:boost::remove_pointer< bool (*)() >::typebool ()()

因此在 GCC 上不存在合适的 MakeFunction 模板。

有什么方法可以改变任一平台上 remove_pointer 输出的输出以匹配另一个平台?还是有其他方法可以解决这个问题?

最佳答案

您可以创建一个类型推导的 maker 函数模板:

template <typename R>
boost::function<R()> make_function(R(*f)())
{ return boost::function<R()>(f); }

template <typename R, typename ...Args>
boost::function<R(Args...)> make_function(R(*f)(Args...))
{ return boost::function<R(Args...)>(f); }

如果您的编译器不支持可变参数模板,您可以使用类似 Microsoft 的预处理器 hack 来模拟它们(例如,参见 pretty printer source code 示例)。

关于c++ - 从函数指针创建 boost::function 的跨平台方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8563583/

相关文章:

c++ - 如何从由 | 分隔的 txt 文件中提取数据

c++ - 使用 SFINAE 的 C++ 中的可移植 typeof()?

multithreading - 多个线程在 C++ 中等待同一个事件句柄

c++ - 改进使用 MFC FindFile API 失败

c++ - 功放库错误

c++ - Eclipse CDT 5.0.1 (Ganymede) 缓慢的索引器问题

c++ - 层次结构中子类的对象的部分构造和破坏

c++ - 从 C++ 项目添加对 WCF 服务的 Web 引用时出错

c++ - 仅为类的特定模板实例化声明成员函数

c++ - CLion:无法解析 <member_variable_name>