如何修改 std::generate 的绑定成员函数的结果
How to modify the result of a bound member function for std::generate
我正在使用VS2008兼容代码和Boost 1.60(没有C++11)。我有一个返回类似列表的界面的第三方库。我想获取列表中的元素并将它们放在 std::vector 中。track_list
类有一个next
方法,该方法返回指向跟踪指针track**
的指针。
我想我可以使用 std::generate 来填充与track_list
大小相同的向量。 我能够想出boost::bind(&track_list::next, tracks)
让我获得track**
,但我不确定如何添加取消引用部分以使track*
进入vector<track*>
。
此外,实际上有一个我知道可以从track*
安全地投射到specific_track*
。所以我真正想要的是类似于(specific_track*)(*boost::bind(&track_list::next, tracks))
的东西,但我不确定如何在语法上构建它。我走在正确的轨道上吗?我查看了提升 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包装在某种绑定或 lambda 中以执行取消引用,而无需创建单独的函数来执行此操作。
第二部分,演员阵容,是这样的:
int main() {
std::vector<double*> nums(10);
std::generate(nums.begin(), nums.end(), get_ptr_num) // cannot convert from int** to double*
}
这似乎与 11 个 lambda C++有关,但我不能使用 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*
}
您可以使用函数输入迭代器:
住在科里鲁
#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
可能会更简单:
住在科里鲁
#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
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 在基于范围的for循环中使用结构化绑定声明
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 视觉studo 2019中的漫画和静态/动态绑定
- 将自由函数绑定为类成员函数
- 将常量指针引用绑定到非常量指针
- 在派生类中绑定非静态模板化成员函数
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 在 openGL 中多次绑定缓冲区
- 定义有趣的宏和正则表达式在Z3 C++绑定
- 使用结构化绑定'Reflection'
- 为什么 std::绑定错误参数可以成功?
- 如何绑定 C++ gRPC 客户端的网络接口
- 在 openmp 中,omp_get_thread_num是否绑定到物理线程?
- C++绑定(已弃用)
- 运行时错误:引用绑定到类型为"int"的空指针
- 有没有办法将重载的类函数绑定到函数对象?
- 如何修改 std::generate 的绑定成员函数的结果