重载std :: get for enum索引数组

时间:2014-09-02 16:09:09

标签: c++ arrays templates c++11 enums

我觉得有一个类基本上像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最有用的功能)

1 个答案:

答案 0 :(得分:5)

你还不能。你想要的是Implicit Template Parameters。委员会喜欢这个想法,但希望看到所提出的符号与dyp提到的auto符号的比较。我已承诺为11月的标准会议制定新的草案。我可以包含你的例子吗?

相关问题