【发布时间】:2014-10-26 23:30:13
【问题描述】:
我发现拥有一个基本上类似于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 放在参数列表的第二个或更远的位置,那么问题是我不能只指定这个参数,而必须指定其他的东西,这看起来不像正常的std::get致电std::array。
2) 如果我在 enum_array 类中将 get 函数定义为友元函数,那么一切看起来都很好,除了它将被放置在类 enum_array 所属的同一个命名空间中。并且把它放在namespace std 并不是最好的设计。
所以我的问题是:带有枚举参数的std::get 能否以我提到的使用 C++ 模板机制的此类的方式重载?
(想指出这个问题主要是出于好奇,毕竟std::get在我看来并不是std::array最有用的功能)
【问题讨论】:
-
我认为您遇到了(相当)常见的问题,即没有
template<auto Value>(推断出类型的模板非类型参数)之类的东西。因此,您要么必须为每个枚举类型指定一个函数(模板),例如template<first_enum Value> auto get(..);、template<second_enum Value> auto get(..);等,要么您必须(手动)为每个调用传递枚举值的类型,例如 @987654341 @,get<second_enum, Value0>(..);
标签: c++ arrays templates c++11 enums