C++ - 将 decltype 与包含在模板类中的枚举一起使用

标签 c++ enums typedef decltype

我有一个看起来像这样的模板类:

template <typename T>
class Foo {
public:
  enum Mode { Mode1, Mode2, Mode3 };
  // ...
};

我实例化这个:

Foo<float> foo;
// ...
auto m = Foo<float>::Mode1;

但在我看来,在实例化 Foo 模板时包含对我使用的类型的源依赖是一种不必要的冗余。经典的解决方案是对整个类型使用 typedef:

typedef Foo<float> FooType;
FooType foo;
// ...
auto m = FooType::Mode1;

但在我看来,编译器应该能够从实际的实例变量中导出类型。所以像这样:

Foo<float> foo;
// ...
typedef decltype(foo) FooType;
auto m = FooType::Mode1;

这编译。令我困惑的是为什么我不能将最后一部分作为单个表达式来完成:

auto m = typename decltype(foo)::Mode1;

这会导致编译器错误“Expected '(' for function-style cast or type construction”。

我想这样做的原因是因为我有比 T 更多的模板参数,而顶级 typedef 可能是我想知道的最明智的解决方案为什么我在单行上使用 decltype 不起作用。

我正在使用 Clang 3.0,但无法使用 -std=c++11,因此我只能使用 Clang 3.0 中的默认 C++ 功能。不幸的是我不能在这个版本中使用枚举类。

最佳答案

这对我有用,使用 g++ 4.8.2。

template <typename T>
class Foo {
public:
  enum Mode { Mode1, Mode2, Mode3 };
};

int main()
{
   Foo<float> foo;
   auto m = decltype(foo)::Mode1;
}

额外的 typename 是问题所在。

关于C++ - 将 decltype 与包含在模板类中的枚举一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24254310/

相关文章:

class - 是否建议在 UML 类图中与枚举类建立关联?

c# - 将枚举的内容获取到下拉列表

c++ - 重复的 typedef - 在 C 中无效但在 C++ 中有效?

c - 解析以太网帧和数据类型

c++ - 在 C++ 中切割位

c++ - 在 C 中我可以将 void* 分配给 char* 但在 C++ 中不行

java - jackson 枚举序列化和反序列化器

c - 在函数上使用 typedef

c++ - 在派生中使用额外的默认参数重载基类方法

c++ - IE Explore 11 < c++ ATL COM Browser Helper Object (Add-on) 替换 DOM 中的文本