gpt4 book ai didi

C++11:返回类型基于输入类型的仿函数的 return_type(用于 std::bind)

转载 作者:搜寻专家 更新时间:2023-10-31 01:12:47 25 4
gpt4 key购买 nike

我在玩仿函数组合,其中仿函数的返回类型取决于输入类型:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com