2

私はファンクターコンポジションで遊んでいます。ファンクターのリターンタイプは入力タイプによって異なります。

template<typename V>
class F
{
protected:
    V v_;
public:
    using return_type = ?;

    F(V v) : v_(v) {}

    template<typename T>
    typename T::U operator()(T t)
    {
        v.method(t);
    }
};

...

X x;
Y y;
F<X> f(x);
F<Y> g(y);
auto h = std::bind(f, std::bind(g, _1));
h(...);  // problem is here :(

それがうまくいくようにreturn_type使用を見つけることは可能ですか?もしそうなら、どのように?decltypestd::bind

編集:リターンタイプはタイプに依存するため、U<T>に置き換えます。typename T::Uこれが今より明確になることを願っています。

編集2(4?):問題を再現するコンパイル可能な例を追加しました。

#include <functional>

using namespace std::placeholders;

template<typename I>
struct R
{
    using IT = I;
    R(I x, I y) : b(x), e(y) {}
    I b;
    I e;
};

template<typename IN, typename II>
class CI
{
    CI(II i) {}
};

template<typename IN>
class C
{
    template<typename IR>
    R<CI<IN, typename IR::IT> >
    operator()(IR& i)
    {
        return R<CI<IN, typename IR::IT> >(
            CI<IN, typename IR::IT>(i.b),
            CI<IN, typename IR::IT>(i.e));
    }
};

struct F {};
struct G {};
struct H {};

int main(int argc, char* argv[])
{
    C<F> a;
    C<G> b;
    auto c = std::bind(a, std::bind(b, _1));
    R<H> r{H{}, H{}};
    c(r);
}
4

3 に答える 3

3

少しの間使用することを忘れてstd::bind、直接アプローチを試してください:

C<F> a;
C<G> b;
R<H> r{H{}, H{}};
a(b(r));

これはコンパイルすらしないので、bindバージョンがコンパイルされる方法はありません!

b(r)アクセス違反のために無効でありa(b(r))、一時的なものを非定数の左辺値参照にバインドしようとしたために失敗した場合は、

于 2012-11-14T19:36:52.673 に答える
1

解決しました!再帰的だったので交換C::operator()(IR& i)しなければなりませんでした。コンストラクターをC::operator()(IR i)追加するとパフォーマンスが向上するかもしれませんが...?実際、何が起こったのかというと、'sエラーは'sほど役に立たなかったということです。まあ、私を責めます。moveIRclanggcc

于 2012-11-14T19:17:38.877 に答える
0

あなたの例は、代替関数構文を使用して解決できます。

#include <iostream>
#include <functional>

template<typename T>
struct Number {
  T t_;
  Number(T t) : t_(t) {}
  T operator+(T t) { return t_ + t; }
};

struct F {
  template<typename T>
  auto operator()(T x) -> decltype(x + 1)
  {
    return x + 1;
  }
} f, g;

int main(int argc, char* argv[])
{
  using namespace std::placeholders;
  auto h = std::bind(f, std::bind(g, _1));
  std::cout << h(Number<int>(1)) << std::endl;
}

ここでvalue_typeは必要ありません。実際、intから返される問題は、によって期待される内部g(_1)にはありません。int::value_typef

于 2012-11-14T18:18:04.550 に答える