我觉得有一个类基本上像std::array
那样但是被一些枚举的值索引的类很方便。我想这不是很难想象如何实现它,让我们说它有这样的签名:
class enum_array <typename EnumT, typename ValueT, size_t N>
另一方面,在尝试实现所有标准std::array
相关函数时,我注意到为这样的类模板编写重载std::get
函数并不那么容易。
首先,我认为这个std::get
将上述枚举的值作为模板参数是很自然的,因此大多数问题都出现了:
1)如果我想在课外定义这样的功能,我必须做一些事情:
namespace std { template <EnumT Index, typename EnumT, typename ValueT, size_t N> EnumT &get (enum_array<EnumT, ValueT, N> &val)
但是问题引起EnumT
在指定第一个模板参数时仍然是未知的,因此该模板实际上形成了错误
如果我将EnumT Index
放在参数列表的第二个或更多位置,那么我就不能真正指定这个参数,并且必须在其中指定其他内容并且看起来不像普通{ {1}}拨打std::get
。
2)如果我将std::array
类中的get
函数定义为友元函数,那么一切看起来都会很好,除非事实上它将被放置在类{{1}的同一名称空间中} 属于。把它放在enum_array
中并不是最好的设计。
所以我的问题是:带有枚举参数的enum_array
能否以我使用C ++模板机制为这样的类提到的方式重载?
(想要指出这个问题主要是出于好奇而引起的,毕竟namespace std
并不是我认为std::get
最有用的功能)
答案 0 :(得分:5)
你还不能。你想要的是Implicit Template Parameters。委员会喜欢这个想法,但希望看到所提出的符号与dyp提到的auto
符号的比较。我已承诺为11月的标准会议制定新的草案。我可以包含你的例子吗?