gpt4 book ai didi

c++ - 绑定(bind)模板化标准库函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:42:46 30 4
gpt4 key购买 nike

你是怎么做到的?替代方案需要将 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 对它们进行了值初始化。

您的绑定(bind)表达式不会将正确数量的参数传递给 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::beginarray_int::end 被重载了,所以你需要将它们转换为 array_int::迭代器 (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 而不是它会更容易一些,因为你不需要嵌套的绑定(bind)表达式,但你仍然需要生成器的类型:

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++ - 绑定(bind)模板化标准库函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26300625/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com