我正在使用VS2008兼容代码与Boost 1.60(没有C++ 11)。我有一个第三方库,它返回一个类似列表的界面。我想获取列表中的元素并将它们放入std :: vector中。 track_list
类有一个next
方法,该方法返回指向轨道指针track**
的指针。如何修改一个绑定成员函数的结果为std :: generate
我在想我可以使用std :: generate来填充一个与track_list
相同大小的向量。我能够拿出boost::bind(&track_list::next, tracks)
这让我track**
,但我不知道如何添加取消引用部分,以获得track*
进入vector<track*>
。
此外,实际上有一个specific_track*
,我知道可以安全地从track*
投。所以我真正想要的是沿着(specific_track*)(*boost::bind(&track_list::next, tracks))
的方向,但我不确定如何构造它的语法。我在正确的轨道上吗?我看了boost lambda,但生成器函数没有参数。
编辑:也许一个更简单的例子可能有助于澄清我正在尝试做什么。
int** get_ptr_num() { int* i = new int(5); return new int*(i); }
int* get_num() { return new int(5); }
int main() {
std::vector<int*> nums(10);
std::generate(nums.begin(), nums.end(), get_num) // compiles
std::generate(nums.begin(), nums.end(), get_ptr_num) // cannot convert from int** to int*
}
基本上我只是想包装在某种约束或拉姆达的get_ptr_num做提领,而无需创建一个单独的函数来进行。
第二部分,中投,将是这样的:
int main() {
std::vector<double*> nums(10);
std::generate(nums.begin(), nums.end(), get_ptr_num) // cannot convert from int** to double*
}
这似乎将是微不足道的与C++ 11个lambda表达式做的,但我不能使用C++ 11
这个是一个成员函数的最后一部分会是这样的东西更多:
class IntGenerator {
public:
int** get_ptr_num() { int* i = new int(5); return new int*(i); }
}
int main() {
IntGenerator int_gen;
std::vector<int*> nums(10);
std::generate(nums.begin(), nums.end(), boost::bind(&IntGenerator::get_ptr_num, int_gen)) // cannot convert from int** to int*
}
是您的目标是创建一个向量,或者是去探索积极使用标准库技术?将一个列表的内容复制到一个向量中很简单:只需对每个元素调用'push_back'即可。 –
我真的不清楚你想要做什么。你有什么代码?它做什么,你不想要。如果你正在寻找一个代码审查,这些都是关于堆栈溢出的话题。另外,在同一个问题中问一堆半相关的问题并不好。最重要的是,我甚至不清楚这个问题与标题有关。 – xaxxon
对不起,我想这个问题很清楚。我如何使用Boost bind/lambdas来获取std :: generate的生成器函数来获取'track **'并将其转换为'specific_track *'? – Paul