如何使用bind与引用传递的抽象类

时间:2013-03-27 10:18:40

标签: 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));
    //...
}

这不编译。

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

但我尝试改变传递测试对象的方式,如果我这样做by pointer, it works

那么有什么我可以用来保存函数签名并仍然使用transform而不是循环吗?

1 个答案:

答案 0 :(得分:4)

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

如果您传递test包裹在std::reference_wrapper中,它将会有效,因为这会导致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));