c++ - 如何在没有默认构造函数的情况下使用 std::transform 创建 std::array

标签 c++ c++11 vector std stdarray

我有一个 std::array<Foo, 10>我想创建一个 std::array<Bar, 10>使用 Foo 中的函数至Bar .通常我会使用 std::transform像这样:

array<Bar, 10> bars;
transform(foos.begin(), foos.end(), bars.begin(), [](Foo foo){
    return Bar(foo.m_1, foo.m_2);
});

但是,Bar没有默认构造函数,所以我无法创建 bars大批。我总是可以使用 vector但如果能够使用 array 那就太好了保证我总是有 10 个元素。这可能吗?

最佳答案

std::transform 没有,但没有什么是模板魔法解决不了的。

template<std::size_t N, std::size_t... Is>
std::array<Bar, N> foos_to_bars(const std::array<Foo, N>& foos,
                                std::index_sequence<Is...>) {
    return {{ Bar(foos[Is].m_1, foos[Is].m_2)... }};
}

template<std::size_t N, std::size_t... Is>
std::array<Bar, N> foos_to_bars(const std::array<Foo, N>& foos) {
    return foos_to_bars(foos, std::make_index_sequence<N>());
}

std::index_sequence和 friend 是 C++14,但在 C++11 中很容易实现。仅 SO 就可能有六种实现。

关于c++ - 如何在没有默认构造函数的情况下使用 std::transform 创建 std::array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32175408/

相关文章:

c++ - 是否有一个不会被省略的 move 构造的简单示例?

c++ - std::transform 和 std::plus 如何协同工作?

javascript - 如何绕轴旋转 Three.js Vector3?

arrays - 从 opencv::Mat 中删除选定的行?

c++ - 为什么我的循环没有终止?

c++ - 在 Windows dll 中使用 boost::asio::deadline_timer 时出现死锁

c++ - 既然其他可滥用但有用的特性已经标准化,为什么不#pragma once呢?

c++ - 如何在 MinGW 中启用实验性 C++11 并发功能?

java - 将数组 vector 转换为一个数组

c++ - 使用 printf() 改变多线程结果?