1

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

もう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 に答える
1

このコードは、あなたが思っていることをしていないという印象があります。

 typename function<void ()>::type

関数を返す関数を作成するだけのResとして「void()」をバインドします。

どうですか:

...

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

...

?

boost::type_traits と boost::type_traits::function_traits を特別に使用して取得しようとしているエイリアシングに似たものを取得できます。とはいえ、単純で移植可能なソリューションが必要な場合、最も簡単なのはブーストを使用し、C++ コンパイラと C++11 の STL サポートでより良い時間を待つことだと思います。

于 2013-01-27T07:28:00.787 に答える