Mat*_*son 10 c++ c++11 stdtuple
我必须专门支持std :: get的模板是什么?
struct MyClass {
int a;
};
template <const size_t I>
struct MyContainer {
MyClass array[I];
};
Run Code Online (Sandbox Code Playgroud)
我有什么专业能够做到的:
MyContainer<16> mc;
std::get<0>(mc);
Run Code Online (Sandbox Code Playgroud)
eca*_*mur 14
std::get
不是标准库的自定义点; (三个函数模板重载pair
,tuple
和array
)没有明确允许用户自定义的过载,因此17.6.4.2.1p1适用,添加自己的函数模板重载的声明是未定义的行为.
请注意,get
作为非限定名称是从C++ 17开始的自定义点; 结构化绑定声明协议使用它来访问类似元组的元素; 但这是一个不合格的名字,而不是合格的名字std::get
.
这就是说,如果你是这样写:
namespace std {
template<size_t I, size_t N> MyClass &get(MyContainer<N> &c) { return c.array[I]; }
}
Run Code Online (Sandbox Code Playgroud)
类似地,对于rvalue引用和const引用重载,您的程序可能会按预期工作.
然而,标准已经提供了很少的观点array
:
template<size_t N> using MyContainer = std::array<MyClass, N>;
Run Code Online (Sandbox Code Playgroud)