绑定模板化的标准库函数
Binding a templated standard library function
如何做到这一点?替代方案需要将std::generate
封装在lambda或std::function
中,这是不可取的。
int main()
{
using array_int = std::array<int, 10>;
std::vector<array_int> vec(10);
std::for_each(vec.begin(), vec.end(),
std::bind(std::generate, std::placeholders::_1, []() { return 0; }));
return 0;
}
如前所述,问题是std::generate
采用迭代器对。让我们假设它们是助推范围:
boost::for_each(vec,
boost::bind(boost::generate, _1, []() { return 0; }));
我假设您真的要向generate
传递一些更有用的东西,因为这些数组已经被零填充,因为vector
值会初始化它们。
绑定表达式不会向generate
传递正确数量的参数,因此指定所需的generate
的专用化并不是唯一的问题。为了说明专业化,你需要知道你想要传递的生成器的类型,它是一个lambda,所以你需要把它取出来:
auto gen = [] { return 0; };
然后你需要说你想要哪个generate
:
std::generate<array_int::iterator, decltype(gen)>
然后你需要把正确的论点传递给它:
std::bind(std::generate<array_int::iterator, decltype(gen)>,
std::bind(&array_int::begin, std::placeholders::_1),
std::bind(&array_int::end, std::placeholders::_1),
gen));
这仍然不起作用,因为array_int::begin
和array_int::end
重载了,所以需要将它们强制转换为array_int::iterator (array_int::*)()
才能获得非常量版本。
auto gen = [] { return 0; };
using memfunc = array_int::iterator (array_int::*)();;
std::bind(std::generate<array_int::iterator, decltype(gen)>,
std::bind((memfunc)&array_int::begin, std::placeholders::_1),
std::bind((memfunc)&array_int::end, std::placeholders::_1),
gen));
您可以使用generate_n
使其简单一点,因为您知道大小,并且可能使用data()
而不是begin()
,尽管您仍然需要投射它:
auto gen = [] { return 0; };
using memfunc = int* (array_int::*)();;
std::bind(std::generate_n<int*, int, decltype(gen)>,
std::bind((memfunc)&array_int::data, std::placeholders::_1),
10,
gen));
或者你可以使用lambda:
std::for_each(vec.begin(), vec.end(), [](array_int& a) {
std::generate(a.begin(), a.end(), []{ return 0; });
});
如果您想调用boost::generate
,这会更容易一些,因为您不需要嵌套的绑定表达式,但您仍然需要生成器的类型:
auto gen = [] { return 0; };
std::bind(boost::generate<array_int, decltype(gen)>,
std::placeholders::_1
gen);
或者使用lambda:
std::for_each(vec.begin(), vec.end(), [](array_int& a) {
boost::generate(a, []{ return 0; });
});
相关文章:
- 覆盖程序中的标准 C 库函数C++
- VS2017 #error: : snprintf 的宏定义与标准库函数声明冲突
- 为什么C++标准库容器函数 empty() 标记为 [[nodiscard]]?
- 在Xcode中使用C++17标准库中的bessel数学函数
- 在 MASM 中调用标准库函数
- 如何在标准库C/C++函数中进行gdb单步执行操作
- 标准库函数 abs() 在不同C++编译器上的异常行为
- 确定C++中用户输入的类型,而无需任何标准库函数
- 是否有用于双精度平方根反比的快速 C 或 C++ 标准库函数
- 为什么我能够在没有std::限定符的情况下调用这个C++标准库函数
- 如何使用标准库函数通过错误检查将字符串 (char*) 转换为数字
- 绑定模板化的标准库函数
- 在C++中使用标准库函数名称作为标识符是否有效
- C++中标准库函数的函数重载
- 为什么win32/标准库函数参数几乎总是作为指针而不是引用传递
- C++标准库函数和类是否包含在每个C++实现中
- C和c++标准库函数如何查找文件的末尾
- 是否有一个标准库函数来反转STL堆栈?
- 是std::命名空间中的C标准库函数的C++版本
- 为什么标准库函数中没有提供带有迭代器参数的重载?