你是怎么做到的?替代方案需要将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; }));
答案 0 :(得分:3)
我认为你真的要传递一些对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::*)()
以获取非const版本。
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; });
});