【问题标题】:Overloading std::get for enum indexed array为枚举索引数组重载 std::get
【发布时间】: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&lt;auto Value&gt; (推断出类型的模板非类型参数)之类的东西。因此,您要么必须为每个枚举类型指定一个函数(模板),例如 template&lt;first_enum Value&gt; auto get(..);template&lt;second_enum Value&gt; auto get(..); 等,要么您必须(手动)为每个调用传递枚举值的类型,例如 @987654341 @, get&lt;second_enum, Value0&gt;(..);

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


【解决方案1】:

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

【讨论】:

  • 肯定没问题。虽然这里有一个答案,从技术上讲,从 std 重载函数是不合法的,所以它可能需要重新制定才能准确地遵守标准。
  • 明白,但这似乎不是什么大问题。您可以使用using 语句来确保std::getmyns::get 都参与重载决议。由于这有点松散,最好让myns::get 代表std::get 处理它无法处理的情况等等。现在,如果你有一个模板希望调用std::get 它不会'找不到你的功能,但如果它想要非标准行为,它应该调用 std::get 以外的东西。
猜你喜欢
  • 1970-01-01
  • 2016-06-26
  • 1970-01-01
  • 2010-09-29
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
相关资源
最近更新 更多