7

現在、値に 2 つの関数を適用して 2 つの値のタプルを返すには、次のようにします。

template<typename F1, typename F2>
class Apply2
{
public:
    using return_type = std::tuple<typename F1::return_type, typename F2::return_type>;

    Apply2(const F1& f1, const F2& f2) : f1_(f1), f2_(f2) {}

    template<typename T> return_type operator()(const T& t) const
    {
        return std::make_tuple(f1_(t), f2_(t));
    }

protected:
    const F1& f1_;
    const F2& f2_;
};

これを N 関数に一般化したかったのです。

template<typename ...F>
class ApplyN
{
public:
    using return_type = std::tuple<typename F::return_type...>;

    ApplyN(const std::tuple<F...>& fs) : functions_(fs) {}

    template<typename T> return_type operator()(const T& t) const
    {
        return ???;
    }

protected:
    std::tuple<F...> functions_;
};

おそらく何らかの方法でテンプレート再帰を使用する必要があることはわかっていますが、頭を包むことはできません。何か案は?

4

1 に答える 1

6

しばらく時間がかかりましたが、ここにあります(indexsを使用):

template<typename ...F>
class ApplyN
{
public:
    using return_type = std::tuple<typename F::return_type...>;

    ApplyN(const F&... fs) : functions_{fs...} {}

    template<typename T> return_type operator()(const T& t) const
    {
        return with_indices(t, IndicesFor<std::tuple<F...> >{});
    }

protected:
    std::tuple<F...> functions_;

    template <typename T, std::size_t... Indices>
    return_type with_indices(const T& t, indices<Indices...>) const
    {
        return return_type{std::get<Indices>(functions_)(t)...};
    }
};

誰かが以前に (不完全な) 答えを持っていましたが、その人はそれを消してしまいました - それが私の出発点でした。とにかく、見知らぬ人に感謝します!R.マルティーニョ・フェルナンデスもありがとう!

于 2012-11-27T19:57:31.933 に答える