コンパイルしているプラットフォームで利用できるものに応じて、ブースト関数と 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();
}