[英]Accessing tuple value via scoped and typed enum fails
當嘗試通過作用域和類型化的枚舉訪問元組的值時,我收到一條錯誤消息,指出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
,為什么會失敗?
我知道我可以強制轉換枚舉的值,但是由於兩個基本類型相同,我不確定為什么要這么做。 在沒有范圍的枚舉的情況下,這很好用。
枚舉類實際上不是表面上的整數。 就像僅包含一個int的結構不是一個int一樣。
返回整數表示形式的C ++標准方法是:
using UserUndT = std::underlying_type<User>::type;
std::cout <<
std::get<static_cast<UserUndT>(User::FirstName)>(user) << std::endl;
另外,請檢查以下問題: 在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;
}
得到你想要的你可以做的:
namespace User{enum User:size_t{FirstName,LastName};};
那么您將再次獲得裸露的枚舉。
名稱空間解決方案可以工作,但不能在函數或類內部工作。 替代方法如下:
#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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.