![](/img/trans.png)
[英]Sum the components of a tuple up by using std::get, std::tuple_size, std::tuple_element
[英]C++: Can std::tuple_size/tuple_element be specialized?
是否允许自定义类型的std::tuple_size
和std::tuple_element
? 我想是的,但我想绝对肯定,我找不到任何具体的信息。
示例(名称空间,成员函数和get<I>
重载被省略):
template <typename T, size_t N>
struct vector { T _data[N]; };
template<size_t I, typename T, size_t N>
constexpr T& get(vector<T,N>& vec) { return vec._data[I]; }
namespace std {
template<typename T, size_t N>
class tuple_size< vector<T,N> > : public std::integral_constant<size_t, N> { };
template<size_t I, typename T, size_t N>
class tuple_element< I, vector<T,N> > { public: using type = T; };
}
我需要它用于结构化绑定:
void f(vector<T,3> const& vec)
{
auto& [x,y,z] = vec;
// stuff...
}
用户定义类型的专业化通常很好,而且一直都是。 N4606,[namespace.std] / 1:
只有当声明取决于用户定义的类型并且特化符合原始模板的标准库要求且未明确禁止时,程序才可以将任何标准库模板的模板特化添加到命名空间
std
。
对于tuple_size
,原始模板的要求在[tuple.helper] / 1中指定:
tuple_size<T>
所有tuple_size<T>
都应满足UnaryTypeTrait
要求,对于某些N
integral_constant<size_t, N>
BaseCharacteristic
为integral_constant<size_t, N>
。
UnaryTypeTrait
,反过来,在[meta.rqmts] / 1:
UnaryTypeTrait描述了类型的属性。 它应该是一个类模板,它接受一个模板类型参数,以及可选的其他参数,这些参数有助于定义所描述的属性。 它应该是
DefaultConstructible
,CopyConstructible
,并且直接或间接地从其BaseCharacteristic公开和明确地派生, BaseCharacteristic是模板integral_constant
特化 ,其中模板的参数为integral_constant
由所描述的特定属性的要求确定。 BaseCharacteristic的成员名称不应隐藏,并且应在UnaryTypeTrait中明确可用。
tuple_element
的要求在[tuple.helper] / 6和[meta.rqmts] / 3中指定,但为了简洁起见,我不会在此处发布。 可以说专业化确实合法......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.