如何对通过引用传递的抽象类使用绑定

Mik*_*Mik 4 c++ stl standard-library stdbind

我正在尝试将 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));
    //...
}
Run Code Online (Sandbox Code Playgroud)

这不编译。

我正在使用 VS2008 SP1 并且我收到了很多我不明白的模板错误,所以我在 ideone (gcc 4.7.2) 中进行了尝试。在那里,我遇到了一些更具可读性的错误,我得出结论,这与 ITest 是抽象的有关。

但是我已经尝试过改变我通过测试对象的方式,如果我通过指针来做,它就可以工作

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

Jos*_*eld 5

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

如果您传递test包裹在 a 中std::reference_wrapper,它将起作用,因为这会导致std::bind存储对对象的左值引用:

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

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

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