我想用沒有標準建構式的物件填充大小為N的 std::array 。
std::array<non_std_con,N> myArray;
(std::array<kissfft<float>, 64>就我而言,具體來說)
這導致錯誤
錯誤:使用已洗掉的函式...標準建構式
設定
您可以使用初始化串列填充陣列:
std::array<non_std_con,N> myArray{non_std_con{init1,init2},non_std_con{init1,init2},...}
初始化串列需要N 個物件。
您可以使用引數包構建一個陣列:
template <class... Params>
auto constexpr build_array(Params... params)
{
std::array<non_std_con, sizeof...(params)> myArray= {params...};
return myArray;
}
題
有沒有辦法反過來使用它并從單個引數中構建一個引數包:
std::array<non_std_con,N> buildArray(inti1,init2);
這將構建一個包含N 個 non_std_con的陣列,其中每個物件都用 {init1,init2} 初始化
感謝您的時間
uj5u.com熱心網友回復:
你可以寫:
#include <array>
#include <utility>
#include <iostream>
namespace detail
{
template <
typename T,
std::size_t ... Is
>
constexpr std::array<T, sizeof...(Is)> create_array(T value, std::index_sequence<Is...>)
{
// cast Is to void to remove the warning: unused value
return {{(static_cast<void>(Is), value)...}};
}
}
template<
typename T,
int N,
typename... CtorAgrs
>
constexpr std::array<T, N> buildArray(CtorAgrs... args)
{
using Array = std::array<T, N>;
return detail::create_array<T>(T{args...}, std::make_index_sequence<N>());
}
struct Foo{
int a, b;
constexpr Foo(int a, int b) : a(a), b(b)
{
}
};
int main() {
constexpr auto array = buildArray<Foo, 10>(1, 2);
for(const auto& f : array){
std::cout << f.a;
std::cout << "\n";
}
}
或者簡單地使用 C -20:
template<
typename T,
int N,
typename... CtorAgrs
>
constexpr std::array<T, N> buildArray(CtorAgrs&&... args)
{
auto doBuildArray = [&]<std::size_t ... Is>(std::index_sequence<Is...>)
-> std::array<T, N>
{
// cast Is to void to remove the warning: unused value
return {{(static_cast<void>(Is), T{args...})...}};
};
return doBuildArray(std::make_index_sequence<N>());
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/361792.html
