gpt4 book ai didi

c++ - 如何将绑定(bind)与通过引用传递的抽象类结合使用

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:55:04 25 4
gpt4 key购买 nike

我正在尝试使用 std::transform 和 std::bind 来简化循环。这是一些代码:

class ITest
{
public:
virtual CPrueba Prueba(double p, double d = 0)const = 0;
};

void foo(const ITest& test)
{
std::vector<double> v;
std::vector<CPrueba> vRes;
// ...
// ...
std::transform(v.begin(), v.end(), back_inserter(vRes),
bind(&ITest::Prueba, test, _1, 0));
//...
}

这不会编译。

我正在使用 VS2008 SP1,我遇到了很多我不理解的模板错误,所以 I've tried in ideone (海湾合作委员会 4.7.2)。我有一些更易读的错误,我得出的结论是它与 ITest 是抽象的有关。

但我已经尝试通过改变我通过测试对象的方式,如果我这样做了 by pointer, it works .

那么有什么我可以用来保留函数签名并仍然使用带绑定(bind)的转换而不是循环吗?

最佳答案

std::bind 在内部存储每个参数的 std::decayed 类型。通过 test 时,这会导致它尝试存储 ITest 类型的对象,这当然是抽象的。

如果您通过包装在 std::reference_wrapper 中的 test,它将起作用,因为这会导致 std::bind 存储一个左值引用对象:

std::transform(v.begin(), v.end(), back_inserter(vRes), 
bind(&ITest::Prueba, std::ref(test), _1, 0));

您也可以传递一个指向对象的指针,因为 std::bind 也接受这个:

std::transform(v.begin(), v.end(), back_inserter(vRes), 
bind(&ITest::Prueba, &test, _1, 0));

关于c++ - 如何将绑定(bind)与通过引用传递的抽象类结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15656436/

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