作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在玩仿函数组合,其中仿函数的返回类型取决于输入类型:
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);
}
最佳答案
暂时忘记使用 std::bind
并尝试直接方法:
C<F> a;
C<G> b;
R<H> r{H{}, H{}};
a(b(r));
这甚至无法编译,所以 bind
版本不可能!
b(r)
由于访问冲突而无效,如果您修复 a(b(r))
失败,因为您尝试绑定(bind) a临时到非常量左值引用
关于C++11:返回类型基于输入类型的仿函数的 return_type(用于 std::bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13383749/
我是一名优秀的程序员,十分优秀!