c++ - 如何复制初始值设定项列表?

标签 c++ c++11

以下内容不会为我输出任何内容。据我了解,初始化器列表的生命周期非常有限,并且复制初始化器列表不会复制底层元素。我认为按值传递将允许移动,甚至显式移动也不起作用。我无法将其绑定(bind)到引用,并且使用单独的引用变量在这里不起作用。即使使用 vector 也不起作用?

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;
}

最佳答案

您的谓词是错误的:您向其传递的是 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);

关于c++ - 如何复制初始值设定项列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26322345/

相关文章:

c++ - 如何从一个类中的命名空间初始化所有变量

c++ - 尝试所有还是只尝试必要的?

c++ - 我应该用什么值填充数组以指示空白?

c++ - 存储在结构中的元素是否彼此相邻

inheritance - shared_ptr 返回一个接口(interface)

c++ - TR1 是 "missing"- 我的项目配置中缺少哪个 header 或库?

c++ - 基于模板类型参数的条件成员签名及实现

c++ - STD::元组实现 C++

c++ - 使用 SIMD 管理将累积(单个)值打包成两个值的清理代码循环的方法是什么?

c++ - 为什么枚举类的默认类型与枚举的基础类型不同?