1

我试图弄清楚如何在 boost 函数和 c++11 函数之间切换,具体取决于我编译它的平台可用。我知道 c++ 没有模板别名(c++11 之前),所以我写了以下内容,但我无法理解错误消息或为什么它不起作用:

#define FUNCTION_Boost

#if defined(FUNCTION_Boost)
   #include <boost/function.hpp>
#elif defined(FUNCTION_STL)
   #include <functional>
#endif

template<typename Res, typename... ArgTypes>
struct function {
   #if defined(FUNCTION_Boost)
   typedef boost::function<Res(ArgTypes...)> type;
   #elif defined(FUNCTION_STL)
   typedef std::function<Res(ArgTypes...)> type;
   #endif
};

// In instantiation of ‘function<void()>’:
// error: function returning a function
void foo(function<void ()>::type f) {
   f();
}

// this works fine
void bar(boost::function<void ()> f) {
   f();
}
4

2 回答 2

1

我的印象是这段代码没有做你认为它做的事情:

 typename function<void ()>::type

将“void ()”绑定为 Res,只是创建了一个返回函数的函数。

关于什么:

...

void foo(typename function<void >::type f) {
   f();
}

...

?

您可以获得类似于您试图通过 boost::type_traits 和 boost::type_traits::function_traits 特别获得的别名。也就是说,我怀疑如果您想要一个简单且可移植的解决方案,那么最简单的方法是使用 boost 并等待 C++ 编译器和对 C++11 的 STL 支持的更好时机。

于 2013-01-27T07:28:00.787 回答
1

无需再定义一个function......一切都可以使用using;)

#define USE_BOOST_FUNCTION

#ifdef USE_BOOST_FUNCTION
# include <boost/function.hpp>
# define FUNCTION_NS boost
# else
#  include <functional>
# define FUNCTION_NS std
# endif

#include <iostream>

namespace test {
using FUNCTION_NS::function;
}

int main()
{
    test::function<void()> f = [](){ std::cout << __PRETTY_FUNCTION__ << std::endl; };
    f();
    return 0;
}
于 2013-01-27T07:42:50.317 回答