当尝试通过作用域和类型枚举访问元组的值时,我收到一条错误消息,指出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
,为什么会失败?
我知道我可以转换枚举的值,但我不确定为什么这两个基础类型是相同的。使用无范围的枚举,这可以正常工作。
答案 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;
}