2014-09-02 41 views
4

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

+1

我觉得你患有(模板非模型参数的类型被推导出来)这样的(模板)之类的(而非常常见的)问题。因此,您必须为每个枚举类型指定一个函数(模板),例如'template auto get(..);','template auto get(..);'等等,或者您必须(手动)为每个调用传递枚举值的类型,àla'get (..);','get (..);' – dyp 2014-09-02 16:32:47

回答

5

你目前还不能。你想要的是Implicit Template Parameters。委员会喜欢这个想法,但希望看到提议的表示法与dyp提到的auto表示法的比较。我已经承诺11月的标准会议新草案。好的,我可以包括你的例子吗?

+0

它肯定没问题。尽管这里有个答案,从技术上来说,从std中加载函数是不合法的,所以也许需要一些重新定义来精确地遵守标准。 – Predelnik 2014-09-02 17:35:13

+0

了解,但这似乎不是一个障碍。您可以使用'using'语句来确保'std :: get'和'myns :: get'参与重载解析。由于这有点松散,所以对于它无法处理的情况,将myns :: get委托给std :: get可能会更好。现在,如果你有一个模板可以调用'std :: get'它不会找到你的功能,但是如果它想要非标准的行为,它应该调用除'std :: get'之外的东西。 – user2913094 2014-09-02 19:05:00