将C++ 11枚举类作为模板传递,同时自动推断其类型

Joh*_*nes 6 c++ enums templates c++11

这个最小的例子编译没有警告和运行:

// library
template<class T, T t> struct library_struct {};

// user
enum class my_enum { x, y, z };
int main()
{
    library_struct<my_enum, my_enum::x> unused; // l.7
    (void) unused;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在,我希望编译器my_enum从枚举模板参数中推导出类型模板参数my_enum::x.这样看起来会更好:

library_struct<my_enum::x> unused;
Run Code Online (Sandbox Code Playgroud)

我见过编译器能够推导出模板参数的例子,但我只允许省略模板参数列表中的最后一个模板参数.那么可以在这里省略枚举类型吗?

编辑:我对没有宏的解决方案感兴趣.

Yak*_*ont 1

有3种方法,但都不好。

首先,您可以等待更高版本的标准:已经提出了许多解决此问题的建议。我不知道是否有人将其纳入 C++1y 中。

第二,宏。

第三,使用推导类型。这迫使枚举值最多只能是一个constexpr参数。

简短的回答是“你不能按照你要求的去做,至少不能干净利落地”。这一混乱局面已经被注意到,也许有一天会得到解决。