我正在尝试使用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而不是循环吗?
答案 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));