< p > 对于自定义类型,是否允许使用
std::tuple_size
和 std::tuple_element
进行特化?我想是可以的,但我想要确定,并且我找不到任何具体信息。 < /p >
< p > 例如(省略命名空间、成员函数和 get<I>
重载):< /p >
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...
}
auto[a,b,c]
结构化绑定功能。 - Yakk - Adam NevraumontF<X...> ~= tuple<F<X>...>
,G<S, Y...> ~= tuple<G<S, Y>...>
等等,如果它们是元组的子类,我仍然必须定义tuple_element<I, F<X...>>: tuple_element<I, tuple<F<X>...>>
等等。我能想到的就是打开通用的tuple_size<S>
/tuple_element<I,S>
,使用size()
或基类,但这似乎会引发麻烦。如果我做不到更好,我将不得不使用宏。 - John Ptemplate<class T> struct tuple_size<enable_if_t<is_tuple<typename T::type>::value, T>>: ...
但遗憾的是T无法推导。我想这就是概念的用途。简单问题,那个is_convertible<D*,B*>
技术是用来避免使用is_base_of<B,D>
产生假负面吗?为什么要同时使用两者? - John Pis_base_of
对于私有和模糊继承的基类返回 true;由于我们想要委托给std::tuple
的tuple_size
和tuple_element
而不需要转换,我们需要确保我们的对象也可以隐式转换为tuple
。在这种情况下,is_base_of
检查实际上比我们严格需要的检查更强,因为我们可以只检查可转换性以支持具有元组成员和operator std::tuple<...>&
而不是元组基类的类型,但我希望这个概念尽可能地描述my_tuple_base
,而不是实际命名它。 - ildjarn