我正在试图弄清楚如何在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();
}
答案 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;
}