我希望能够在构造函数的初始化程序列表中使用参数包扩展。为实现这一目标的最佳方法是为我的班级添加参数包模板参数?这是我的意思的示例:https : //coliru.stacked-crooked.com/a/e699c4cd035e0b1c
#include <utility>
#include <iostream>
template<typename T, std::size_t...Is>
struct base_vec
{
constexpr static std::size_t N = sizeof...(Is);
T e[N];
base_vec() : e{} {}
explicit base_vec(const T& s) : e{((void)Is,s)...} {}
};
template<typename T, std::size_t...Is>
std::ostream& operator<<(std::ostream& lhs, const base_vec<T,Is...>& rhs)
{
return (std::cout << ... << rhs.e[Is]);
}
template<typename T, std::size_t...Is>
constexpr auto getVecIs(std::index_sequence<Is...> seq)
{
return base_vec<T, Is...>{};
}
template<typename T, std::size_t N>
using vec = decltype(getVecIs<T>(std::declval<std::make_index_sequence<N>>()));
int main()
{
vec<int,3> v(2);
std::cout << v << "\n";
return 0;
}
注意微不足道的扩展e{((void)Is,s)...}
。这是一种好的做法,还是我错过了这种方法的一些缺点(除了现在我的结构将具有整个参数包(而不是单个size_t N
)的事实)?
您可以将扩展完全移到类中:
template<typename T, std::size_t N>
struct vec
{
public:
T e[N];
vec() : e{} {}
explicit vec(const T& s) : vec{s, std::make_index_sequence<N>{}} {}
private:
template <std::size_t ... Is>
vec(const T& s, std::index_sequence<Is...>) : e{(Is, s)...} {}
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句