1

function が必要だとします。それを a で構成して別のwhereを生成double adapter(double)する一般的な方法はありますか? 特に、C++11 を使用せずにこれを行う方法があれば素晴らしいと思います。boost::function<double(...)> functorboost::function<double(...)> functor2functor2(...) == adapter(functor(...))

editboost::function<double(...)>明確にするために、任意の を処理できるもの、つまり、1、2、3 などの引数を何度もコピーして貼り付けることなく異なる長さの署名を持つものを書く方法があるかどうかを知りたいと思っています。

4

1 に答える 1

2

C++11 を使用しないと、バラディックな引数や転送など、かなりの数の複雑さが生じます。

C++11 では、主に特殊化することで実行できますstd::is_bind_expression。この関数オブジェクトがバインドで使用されると、バインドされた関数オブジェクトの呼び出し中に提供されたすべての引数と共に格納された関数オブジェクトが呼び出されます。これは、 だけでなく、任意の関数オブジェクトで機能することに注意してくださいstd::function

これは GCC 4.7 で動作します。

#include <functional>
#include <utility>
#include <type_traits>

namespace detail
{
template<typename Func>
struct compose_functor
{

   Func f;

   explicit compose_functor(const Func& f) : f(f) {};

   template<typename... Args>
   auto operator()(Args&&... args) const -> decltype(f(std::forward<Args>(args)...))
   {
    return f(std::forward<Args>(args)...);
   }

};

}

template<typename Func>
 detail::compose_functor
<Func> compose(Func f)
{
   return detail::compose_functor<Func>(f);
}


namespace std
{
   template<typename T>
   struct is_bind_expression< detail::compose_functor<T> > : true_type {};
}
#include <numeric>

int adapter(double d)
{
    return (int)d;
}

int main()
{
    std::function<int(double)> f1 = std::bind(adapter, compose(std::negate<double>()));
    std::function<int(double, double)> f2 = std::bind(adapter, compose(std::plus<double>()));

    // 1.5 -> -1.5 -> -1
    std::cout << f1(1.5) << std::endl;
    // 2.3+4.5 = 6.8 -> 6
    std::cout << f2(2.3, 4.5) << std::endl;
}
于 2012-09-13T20:05:37.900 に答える