18

我有一个std::array<Foo, 10>,我想创建一个std::array<Bar, 10>使用从Footo的函数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 个元素,那就太好了。那可能吗?

4

1 回答 1

17

没有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和朋友是 C++14,但在 C++11 中很容易实现。仅在 SO 上就可能有六种实现。

于 2015-08-24T06:47:03.003 回答