通过作用域和类型枚举访问元组值失败

Ian*_*Ian 2 c++ enums tuples c++14

当尝试通过作用域和类型枚举访问元组的值时,我得到一个错误,指出没有匹配的类型std::get.

enum class User: std::size_t {
    FirstName = 1,
    LastName = 2,
};

std::tuple<std::string, std::string> user("Bobby", "Bean");

// Error
std::cout << std::get<User::FirstName>(user) << std::endl;
Run Code Online (Sandbox Code Playgroud)

鉴于std::get期望类型std::size_t和枚举的基础类型也是std::size_t,为什么这会失败?

我知道我可以转换枚举的值,但我不确定为什么这两个基本类型是相同的.有了无范围的枚举,这很好用.

Joh*_*erg 5

枚举类实际上不是表面上的整数.就像只包含int的结构不是一个int.

回到整数表示的C++标准方法是这样的:

using UserUndT = std::underlying_type<User>::type;
std::cout << 
   std::get<static_cast<UserUndT>(User::FirstName)>(user) << std::endl;
Run Code Online (Sandbox Code Playgroud)

另外,请查看此问题:在VS2012中使用函数签名中的enable_if和underlying_type

另一个值得考虑的选择:(C++ 14)

#include <iostream>
#include <tuple>

struct FirstName {
   std::string val;
};

struct LastName {
   std::string val;
};

using FullName = std::tuple<FirstName,LastName>;

int main() {
  auto user = FullName({"John"},{"Deer"});
  std::cout << std::get<FirstName>(user).val << std::endl;
  std::cout << std::get<LastName>(user).val << std::endl;
}
Run Code Online (Sandbox Code Playgroud)