STL函数/ Boost函数typedef错误

时间:2013-01-27 07:15:26

标签: c++ templates alias typedef

我正在试图弄清楚如何在boost函数和c ++ 11函数之间切换,具体取决于我正在编译它的平台可用。我知道c ++没有模板别名(pre-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();
}

2 个答案:

答案 0 :(得分: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 ++编译器和STL支持C ++ 11的更好时间。

答案 1 :(得分: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;
}