如何访问std :: variant内部的类型?

问题描述

我需要构建一个可以具有多种类型的类的向量:

#include <variant>
#include <vector>
#include "Field.h"

using namespace std;

int main()
{
    variant <int,float> v;
    vector <variant<Field<int>,Field<string>,Field<float>>> fdList;
    fdList[0].getName();
}

这是头文件Field.h

#pragma once
#include <string>
#include <vector>

using namespace std;

template<class T>
class Field
{
public:
    Field();
    Field(string);
    void setName(string);
    string getName();
    bool isPrime();
    void toPrime();
    void toForeign(Field);
    ~Field();

private:
    string FD_Name;
    vector <T> records;
    bool isPrimeK = false;
    string message;
};

template<class T>
string Field<T>::getName()
{
    return FD_Name;
}

当我尝试访问getName()函数时,Visual Studio不断给我以下消息错误:

E0135类“ std :: variant ”没有成员“ getName”
C2039'getName':不是'std :: variant '

的成员

但是,如果我这样定义我的向量,它就可以正常工作

vector <Field<int>> fdList;
fdList[0].getName();

我该如何解决?

解决方法

对于有关标准库的任何问题,建议您首先检查文档。 您可以查看here有关如何使用std::variant的信息。

简而言之,您无法像这样访问std::variant中的内容,因为它的类型是std::variant,而不是您存储在其中的类型。对于您的情况,我认为您可能想先通过调用std::variant::index()方法来检查内部内容,然后通过调用std::get来获取值。

,

variant上调用方法不会自动调用variant的活动替代方法。您必须visit激活替代方法并调用相应的处理程序。在您的情况下,由于您希望以相同的方式处理所有潜在的活动替代方案,因此您可以执行以下操作:

std::visit([](const auto& field) {
  field.getName();
  // ...
},fdList[0]);

或者,您也可以将variant包裹在以下内容中:

struct AnyField {
  string getName() const {
    return std::visit([](const auto& field) { return field.getName(); },v);
  }

  std::variant<Field<int>,Field<string>,Field<float>> v;
};

然后按需要使用它们:

vector<AnyField> fdList;
fdList[0].getName();

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...