参数包和 std::array
Parameter Pack and std::array
我相信之前有人问过这个问题 here,但我可能是错的。是否可以参数包一个std::array
?
template < typename _Ty , typename... _Rest > requires _sqrable_variadic_operation < _Ty , _Rest... >
auto accumulated_sqr ( _Ty n , _Rest... q ) { return sqrof ( n , q... ); };
// Element container of size _Sz and type of _Ty.
std::array < _Ty , _Sz > m_Elems;
public:
. . .
auto length ( void ){
return accumulated_sqr ( m_Elems );
};
是的,可以使用 std::index_sequence
作为助手:
template <std::size_t Sz = 2 , typename Ty = float>
class vector {
protected:
using Elem_Container_t = std::array<Ty , Sz>;
Elem_Container_t m_Elems;
template <std::size_t... Is>
auto length_impl(std::index_sequence<Is...>)
{
return concepts::accumulated_sqr(m_Elems[Is]...);
}
public:
template <typename... Ts>
vector (Ts... elems) : m_Elems {elems... } { }
auto length()
{
return length_impl(std::make_index_sequence<Sz>());
}
};
注意:以下划线开头后跟大写字母的名称保留用于实现。不允许在程序中使用 _Sz
或 _Ty
等名称。
std::array
支持类似元组的接口,这意味着您可以使用 std::apply
将其元素提取到可调用对象的参数列表中:
auto length() const
{
return std::apply([](auto&&... qs) { return accumulated_sqr(decltype(qs)(qs)...); }, m_Elems);
}
我相信之前有人问过这个问题 here,但我可能是错的。是否可以参数包一个std::array
?
template < typename _Ty , typename... _Rest > requires _sqrable_variadic_operation < _Ty , _Rest... >
auto accumulated_sqr ( _Ty n , _Rest... q ) { return sqrof ( n , q... ); };
// Element container of size _Sz and type of _Ty.
std::array < _Ty , _Sz > m_Elems;
public:
. . .
auto length ( void ){
return accumulated_sqr ( m_Elems );
};
是的,可以使用 std::index_sequence
作为助手:
template <std::size_t Sz = 2 , typename Ty = float>
class vector {
protected:
using Elem_Container_t = std::array<Ty , Sz>;
Elem_Container_t m_Elems;
template <std::size_t... Is>
auto length_impl(std::index_sequence<Is...>)
{
return concepts::accumulated_sqr(m_Elems[Is]...);
}
public:
template <typename... Ts>
vector (Ts... elems) : m_Elems {elems... } { }
auto length()
{
return length_impl(std::make_index_sequence<Sz>());
}
};
注意:以下划线开头后跟大写字母的名称保留用于实现。不允许在程序中使用 _Sz
或 _Ty
等名称。
std::array
支持类似元组的接口,这意味着您可以使用 std::apply
将其元素提取到可调用对象的参数列表中:
auto length() const
{
return std::apply([](auto&&... qs) { return accumulated_sqr(decltype(qs)(qs)...); }, m_Elems);
}