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::bindstd::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));
于 2013-03-27T10:28:41.433 に答える