如果您正在使用C++ 17,你可以這樣做:
template <typename T, std::size_t N1, std::size_t N2>
constexpr std::array<T, N1 + N2> concat(std::array<T, N1> lhs, std::array<T, N2> rhs)
{
std::array<T, N1 + N2> result{};
std::size_t index = 0;
for (auto& el : lhs) {
result[index] = std::move(el);
++index;
}
for (auto& el : rhs) {
result[index] = std::move(el);
++index;
}
return result;
}
constexpr std::array<std::uint8_t, 1> one_elem = {1};
constexpr std::array<std::uint8_t, 2> two_elem = {2, 3};
constexpr std::array<std::uint8_t, 3> all = concat(one_elem, two_elem);
它不工作,C++ 14,因爲std::array
不constexpr友好直到C++ 17。但是,如果你不在乎最後的結果是constexpr
,你可以簡單地標記每個變量作爲const
,而這將工作:
const std::array<std::uint8_t, 1> one_elem = {1};
const std::array<std::uint8_t, 2> two_elem = {2, 3};
const std::array<std::uint8_t, 3> all = concat(one_elem, two_elem);
編譯器將幾乎肯定優化concat
路程。
如果你需要一個C++ 14解決方案,我們必須通過std::array
的構造函數來創建它,所以它不是幾乎一樣漂亮:
#include <array>
#include <cstdint>
#include <cstddef>
#include <type_traits>
// We need to have two parameter packs in order to
// unpack both arrays. The easiest way I could think of for
// doing so is by using a parameter pack on a template class
template <std::size_t... I1s>
struct ConcatHelper
{
template <typename T, std::size_t... I2s>
static constexpr std::array<T, sizeof...(I1s) + sizeof...(I2s)>
concat(std::array<T, sizeof...(I1s)> const& lhs,
std::array<T, sizeof...(I2s)> const& rhs,
std::index_sequence<I2s...>)
{
return { lhs[I1s]... , rhs[I2s]... };
}
};
// Makes it easier to get the correct ConcatHelper if we know a
// std::index_sequence. There is no implementation for this function,
// since we are only getting its type via decltype()
template <std::size_t... I1s>
ConcatHelper<I1s...> get_helper_type(std::index_sequence<I1s...>);
template <typename T, std::size_t N1, std::size_t N2>
constexpr std::array<T, N1 + N2> concat(std::array<T, N1> const& lhs, std::array<T, N2> const& rhs)
{
return decltype(get_helper_type(std::make_index_sequence<N1>{}))::concat(lhs, rhs, std::make_index_sequence<N2>{});
}
constexpr std::array<std::uint8_t, 1> one_elem = {1};
constexpr std::array<std::uint8_t, 2> two_elem = {2, 3};
constexpr std::array<std::uint8_t, 3> all = concat(one_elem, two_elem);
也許這是可能的。你建議如何使它適合兩個以上的陣列? –
注意'3'可以是'one_elem.size()+ two_elem.size()',因爲'array :: size'是'constexpr'。 – vsoftco
@vsoftco你可以隨時聲明它爲'constexpr auto all = ...' – Justin