Как получить доступ к .second в std :: pair с помощью std :: variant? - PullRequest
0 голосов
/ 06 мая 2020

Я использую MinGW64 с G CC 7.5.0, который включает C ++ 17 на Dev C ++ 5.11 на Windows 7.

Теперь, как получить доступ к .second в следующем pair?

#include <iostream>
#include <vector>
#include <variant>
using namespace std;
int main()
{
    vector<pair<char,variant<bool,int,string>>> x;
    x.push_back(make_pair('i',5));
    cout<<x[0].first; //ok
    cout<<x[0].second; //error: no match for 'operator<<'
}

Ответы [ 3 ]

1 голос
/ 06 мая 2020

Используйте std::get для извлечения объекта, если вы знаете его тип.

std::cout << std::get<int>(x[0].second)

Если вы не знаете тип, используйте std::visit: https://en.cppreference.com/w/cpp/utility/variant/visit

0 голосов
/ 06 мая 2020

Извлечь конкретное c значение из варианта в зависимости от типа:

if(auto pval = std::get_if<int>(&x[0].second)) {
    std::cout << "variant has int value: " << *pval << '\n'; 
} else {
    std::cout << "failed to get int value!" << '\n'; 
}

if(auto pval = std::get_if<bool>(&x[0].second)) {
    std::cout << "variant has bool value: " << *pval << '\n'; 
} else {
    std::cout << "failed to get bool value!" << '\n'; 
}
0 голосов
/ 06 мая 2020

Вы обращаетесь к нему правильно, просто cout не знает, что делать с вашим конкретным variant. Либо извлеките из него определенный тип c, либо напишите собственный operator << для потока, который выполняет то, что вам нужно.

...