gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:01:17 26 4
gpt4 key购买 nike

我一直在编写一些模板,希望通过 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com