4

我正在尝试将 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 并且遇到了很多我不理解的模板错误,所以我在 ideone (gcc 4.7.2) 中进行了尝试。那里我有一些更易读的错误,我得出的结论是它与 ITest 是抽象的有关。

但是我尝试通过更改传递测试对象的方式来尝试,如果我通过指针进行,它可以工作

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

4

1 回答 1

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));

您也可以将指针传递给对象,因为std::bind它也接受:

std::transform(v.begin(), v.end(), back_inserter(vRes), 
               bind(&ITest::Prueba, &test, _1, 0));
于 2013-03-27T10:28:41.433 回答