没有使用参数包的标准构造函数的对象数组
Arrays of Objects without standard constructor using Parameter Packs
我想用没有标准构造函数的对象填充大小为 N 的 std::array。
std::array<non_std_con,N> myArray;
(具体来说,在我的例子中是 std::array<kissfft<float>, 64>
)
这会导致错误
error: use of deleted function ... standard constructor
设置
您可以使用初始化列表填充数组:
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}
感谢您的宝贵时间
你可以这样写:
#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>());
}
我想用没有标准构造函数的对象填充大小为 N 的 std::array。
std::array<non_std_con,N> myArray;
(具体来说,在我的例子中是 std::array<kissfft<float>, 64>
)
这会导致错误
error: use of deleted function ... standard constructor
设置
您可以使用初始化列表填充数组:
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}
感谢您的宝贵时间
你可以这样写:
#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>());
}