【发布时间】:2012-11-14 17:13:46
【问题描述】:
我正在玩仿函数组合,其中仿函数的返回类型取决于输入类型:
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 :(
是否可以使用decltype 找到return_type 以便std::bind 可以工作?如果有,怎么做?
编辑:我将U<T> 替换为typename T::U,因为返回类型取决于类型。我希望这现在更清楚了。
Edit 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);
}
【问题讨论】:
-
您使用但不定义
U。是不是打错字了? -
不
bind使用result_of,因此decltype,反正你甚至不需要return_type? -
U<T>只是依赖于输入类型的返回类型的一个示例。我将其替换为typename T::U以使其更清晰。 -
所以你有任意数量的输入类型,产生任意数量的输出类型,你想 typedef 一个单一的输出类型?我不认为它可以像这样工作。要么要求您的
T::Us 可转换为某种常见类型,要么参数化T上的整个仿函数。 -
最初,整个仿函数是在
T上参数化的——但这使得创建通用仿函数变得不可能。不过,T::U可转换为某些常见类型的要求可能可行。
标签: c++ c++11 std boost-bind