2017-06-09 26 views
0

我正在使用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* 

}

+4

是您的目标是创建一个向量,或者是去探索积极使用标准库技术?将一个列表的内容复制到一个向量中很简单:只需对每个元素调用'push_back'即可。 –

+0

我真的不清楚你想要做什么。你有什么代码?它做什么,你不想要。如果你正在寻找一个代码审查,这些都是关于堆栈溢出的话题。另外,在同一个问题中问一堆半相关的问题并不好。最重要的是,我甚至不清楚这个问题与标题有关。 – xaxxon

+0

对不起,我想这个问题很清楚。我如何使用Boost bind/lambdas来获取std :: generate的生成器函数来获取'track **'并将其转换为'specific_track *'? – Paul

回答

0

你可以使用一个函数输入迭代器:

Live On Coliru

#include <boost/iterator/function_input_iterator.hpp> 
#include <vector> 
#include <functional> 
#include <iostream> 
#include <array> 

namespace TheAPI { 

    struct track_list { 
     std::array<char const*, 6> titles {{ "one", "two", "three", "four", "five", "six" }}; 
     size_t length() const { return titles.size(); } 

     struct Iterator { 
      char const* const* raw; 
      char const* next() { return *raw++; } 
     }; 

     Iterator get_iterator() const { return {titles.begin()}; }; 
    }; 

} 

int main() { 
    TheAPI::track_list tl; 
    auto iter = tl.get_iterator(); 

    auto gen = std::bind(&TheAPI::track_list::Iterator::next, std::ref(iter)); 

    auto first = boost::make_function_input_iterator(gen, 0), 
     last = boost::make_function_input_iterator(gen, 6); 

    std::vector<std::string> titles(first, last); 

    std::copy(titles.begin(), titles.end(), std::ostream_iterator<std::string>(std::cout, "\n")); 
} 

当然,如果你正在考虑的generate,它可以与generate_n更简单:

Live On Coliru

#include <functional> 
#include <iterator> 
#include <algorithm> 
#include <iostream> 
#include <array> 

namespace TheAPI { 

    struct track_list { 
     std::array<char const*, 6> titles {{ "one", "two", "three", "four", "five", "six" }}; 
     size_t length() const { return titles.size(); } 

     struct Iterator { 
      char const* const* raw; 
      char const* next() { return *raw++; } 
     }; 

     Iterator get_iterator() const { return {titles.begin()}; }; 
    }; 

} 

int main() { 
    TheAPI::track_list tl; 
    auto iter = tl.get_iterator(); 

    auto gen = std::bind(&TheAPI::track_list::Iterator::next, std::ref(iter)); 
    std::generate_n(std::ostream_iterator<std::string>{std::cout, "\n"}, tl.length(), gen); 
} 

填写使用

std::vector<std::string> my_vector; 
std::generate_n(back_inserter(my_vector), tl.length(), gen); 

两个程序打印

one 
two 
three 
four 
five 
six 
+0

谢谢,这很有帮助,但我真的很想在不建立单独的函子的情况下做到这一点。我用我想要做的更简单的例子编辑了我的原文。 – Paul

+0

回复简化问题:http://coliru.stacked-crooked.com/a/ff45e245a77cbb11。当心[内存泄漏操作员](https://stackoverflow.com/questions/8839943/why-does-the-use-of-new-cause-memory-leaks)。我会说你需要更少的指针和更聪明的所有权:http://coliru.stacked-crooked.com/a/51b3e4edc6b80af8(使用'unique_ptr <>'转让所有权和'可选的<>'表达可选性) – sehe

+0

不幸的是,我不能使用C++ 11,所以我不能使用C++ 11 lambda;我正在寻找一种方法来使用Boost lambda来做到这一点,但不能找出一个没有参数的函数。 – Paul

相关问题