如何复制initializer_list?

时间:2014-10-12 05:58:10

标签: c++ c++11

以下内容并没有为我输出任何内容。据我所知,initializer_list的生命周期非常有限,复制initializer_list并不复制底层元素。我认为通过价值传递将允许一个举动,甚至一个明确的举动也不起作用。我无法将其绑定到引用,并且使用单独的引用变量在此处不起作用。即使使用矢量也不起作用?

template <typename T, typename Pred>
void for_each(T t, const Pred& pred)
{
    auto local = std::vector<typename T::value_type>{t.begin(), t.end()};

    for (typename decltype(local)::size_type i = 0; i < local.size(); ++i)
        pred(*(i + std::begin(local)));
}

void pred(char c)
{
    std::cout << c << " ";
}

int main()
{
    auto arr { 1, 2, 3 };
    for_each(arr, pred);

    return 0;
}

1 个答案:

答案 0 :(得分:3)

您的谓词错误:您传递了int个值,而不是char,因此您的谓词将传递字符0x01,0x02和0x03,这些字符不可打印。

您可以使用:

void pred(int c)
{
    std::cout << c << " ";
}

现在您的代码正常工作fine

你也可以写一个功能模板:

template<typename T>
void pred(T c)
{
    std::cout << c << " ";
}

注意:

考虑使用for-range编写循环:

for (auto&& v : t)
    pred(v);