什么是我有专攻,支持STD模板::得到什么?
struct MyClass {
int a;
};
template <const size_t I>
struct MyContainer {
MyClass array[I];
};
我有什么专门要能够做到:
MyContainer<16> mc;
std::get<0>(mc);
什么是我有专攻,支持STD模板::得到什么?
struct MyClass {
int a;
};
template <const size_t I>
struct MyContainer {
MyClass array[I];
};
我有什么专门要能够做到:
MyContainer<16> mc;
std::get<0>(mc);
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]; }
}
同样地,对于右值引用和const引用过载,你的程序可能会像您期望的工作。
然而,几乎没有看到点为标准已经提供了array
:
template<size_t N> using MyContainer = std::array<MyClass, N>;
我猜你想使用编译时指数和为此目的使用某些功能(如实施一些算法需要访问任意阵列状容器std::get
)均匀地进行这项任务? 在这种情况下,这是相同的业务,使begin
和end
你的类中可用。 您只需声明函数get
在命名空间中,你宣布你的容器类,并让ADL做它的工作。
template <unsigned I, unsigned N>
MyClass& get (MyContainer<N>& c) { return c.array[I]; }
template <unsigned I, unsigned N>
MyClass const& get (MyContainer<N> const& c) { return c.array[I]; }
在你的算法,你只需要使用get
(不std
命名空间前缀)和ADL将调用正确的函数。 因此,对于标准的结构,如array
, tuple
和pair
std::get
调用并为您的容器中get
您所提供的功能。
int main(){
std::array<int, 3> a {{0,1,2}};
auto t = std::make_tuple(0.0, 1.0f, 2);
auto p = std::make_pair('0', 4.4);
MyContainer<3> c;
std::cout << get<1>(a) << std::endl;
std::cout << get<1>(t) << std::endl;
std::cout << get<1>(p) << std::endl;
std::cout << get<1>(c).a << std::endl;
return 0;
}
例