2017-06-09 58 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

相關問題