C++:std :: tuple_size/tuple_element可以专门吗?

Hed*_*ede 13 c++ c++17

是自定义类型的专业化std::tuple_sizestd::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; };
}
Run Code Online (Sandbox Code Playgroud)

我需要它用于结构化绑定:

void f(vector<T,3> const& vec)
{
    auto& [x,y,z] = vec;
    // stuff...
}
Run Code Online (Sandbox Code Playgroud)

ild*_*arn 14

用户定义类型的专业化通常很好,而且一直都是.N4606,[namespace.std]/1:

std只有当声明取决于用户定义的类型并且特化符合原始模板的标准库要求且未明确禁止时,程序才可以将任何标准库模板的模板特化添加到命名空间.

因为tuple_size,原始模板的要求在[tuple.helper]/1中指定:

的所有专业,tuple_size<T>应当符合UnaryTypeTrait与需求BaseCharacteristicintegral_constant<size_t, N>一段N.

UnaryTypeTrait反过来,在[meta.rqmts]/1中:

一个UnaryTypeTrait描述了一个类型的属性.它应该是一个类模板,它接受一个模板类型参数,以及可选的其他参数,这些参数有助于定义所描述的属性.它应是DefaultConstructible,CopyConstructible和公开和明确地衍生,直接或间接从它BaseCharacteristic,这是模板的一个特例integral_constant,用参数传递给模板integral_constant由对于所描述的特定特性的要求来确定.BaseCharacteristic的成员名称不应隐藏,并且应在UnaryTypeTrait中明确可用.

tuple_element的要求在[tuple.helper]/6和[meta.rqmts]/3中指定,但为了简洁起见,我不会在这里发布.可以说专业化确实合法......