没有使用参数包的标准构造函数的对象数组



我想用没有标准构造函数的对象填充一个大小为N的std::数组。

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

这将构建Nnon_std_con的数组,其中每个对象都用{init1,init2}

感谢您抽出时间

您可以编写:

#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>());
}

最新更新