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

标签 c++ c++11

你是如何做到这一点的?另一种方法需要将 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; };

然后你需要说出你想要哪个生成:

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/

相关文章:

C++:返回 NULL 而不是结构

c++ - 如何从头文件中访问类的私有(private)成员?

c++ - 有可能 "update"一个 QTextCursor 吗?

c++ - 使用 const 对象 move 语义

c++11 - std::move 构造后对象的状态

c++ - 使用比较运算符比较数组

c++ vector 迭代器输出在列中垂直显示

c++ - 我可以使用常量模板吗?

C++0X 概念消失了。还应该使用哪些其他功能?

c++ - 在成员初始化列表中填充 std::array