问题描述
我需要构建一个可以具有多种类型的类的向量:
#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();