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

时间:2015-11-15 18:53:56

标签: 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;

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

我知道我可以转换枚举的值,但我不确定为什么这两个基础类型是相同的。使用无范围的枚举,这可以正常工作。

3 个答案:

答案 0 :(得分:5)

枚举类在表面上确实不是整数。就像只包含int的结构不是int。

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

using UserUndT = std::underlying_type<User>::type;
std::cout << 
   std::get<static_cast<UserUndT>(User::FirstName)>(user) << std::endl;

另外,请查看此问题:Using enable_if and underlying_type in function signature in VS2012

值得考虑的另一种选择:(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;
}

答案 1 :(得分:0)

得到你想要的东西:

namespace User{enum User:size_t{FirstName,LastName};};

然后你将再次使用裸键入的枚举。

答案 2 :(得分:0)

命名空间解决方案可以工作,但不能在函数或类中使用。另一种选择如下:

#include <iostream>
#include <tuple>
#include <vector>
#include <string>
using namespace std;

int main()
{
   struct Test{enum size_t{first, second, third};};
   vector<tuple<int, string, bool>> mt;
   mt.emplace_back(make_tuple(10, "hello", true));
   cout << get<Test::first>(mt[0]) << ' ' << get<Test::second>(mt[0]) << ' ' << get<Test::third>(mt[0]) << endl;
   return 0;
}