私はファンクターコンポジションで遊んでいます。ファンクターのリターンタイプは入力タイプによって異なります。
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
使用を見つけることは可能ですか?もしそうなら、どのように?decltype
std::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);
}