c++ - 为枚举索引数组重载 std::get

标签 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 放在参数列表的第二个或更远的地方,那么就会出现问题,我不能真正只指定这个参数,并且必须指定其他内容,但不会看起来像对 std::array 的普通 std::get 调用。

2) 如果我在 enum_array 类中定义 get 函数作为友元函数,一切看起来都很好,除了它会被放置在同一个命名空间中enum_array 所属的类。将它放在 namespace std 中并不是最好的设计。

所以我的问题是:std::get 是否可以使用 C++ 模板机制以我提到的此类类的方式重载带有枚举参数的方法?

(想指出这个问题主要是出于好奇,毕竟 std::get 在我看来并不是 std::array 最有用的函数)

最佳答案

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

关于c++ - 为枚举索引数组重载 std::get,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25627805/

相关文章:

c# - 如何通过C++或C或C#在Windows中创建指定大小的空文件?

c - C中结构中的字符串数组

javascript - 将 URL 查询字符串解析为数组

c++ - 运行时错误 : Template variable

c++ - 解析二进制文件以查找 C++ 中的 URI

c++ - 如何获取目标应用程序的 tcp/udp 端口​​列表

c++ - 智能指针+循环+ "->"

c++ - 将字符串文字的第一个字符分配给 char 数组会分配整个字符串文字

c++ - 为什么我不能通过模板参数声明一种类型的友元函数但可以使用别名

c++ - 复制迭代器传递的容器