簡體   English   中英

通過作用域和類型化的枚舉訪問元組值失敗

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM