我觉得有一个基本上像std::array
行为,但由某些枚举值索引的类相当方便。我想这是不是很难想象如何实现它,让我们说这有这样的签名:重载std :: get为枚举索引数组
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)如果我定义get
函数内部enum_array
类为好友功能一切都将只是一个事实,即那会被放置在同一个命名空间中的类enum_array
属于看似罚款。并把它放在namespace std
不是最好的设计。
所以我的问题是:可以std::get
与枚举参数重载的方式,我提到这样的类使用C++模板机制?
(想指出的是,这一问题引起了大多是出于好奇,毕竟std::get
不是std::array
在我看来,最有用的功能)
我觉得你患有(模板非模型参数的类型被推导出来)这样的(模板)之类的(而非常常见的)问题。因此,您必须为每个枚举类型指定一个函数(模板),例如'template auto get(..);','template auto get(..);'等等,或者您必须(手动)为每个调用传递枚举值的类型,àla'get (..);','get (..);' –
dyp
2014-09-02 16:32:47