使用类作为数据类型时如何在 std::variant 中存储值?
Posted
技术标签:
【中文标题】使用类作为数据类型时如何在 std::variant 中存储值?【英文标题】:How to store value in std::variant when using a class as a datatype? 【发布时间】:2020-10-16 20:53:40 【问题描述】:我创建了一个类并将该类用作 std::variant 的数据类型。但是当我存储值时,我无法访问它,因为它显示了一些错误。
#include <variant>
#include <string>
#include <iostream>
class Random
public:
int rand_number;
float rand_dec;
;
int main()
Random random;
random.rand_number=1;
random.rand_dec=2.1;
std::variant<Random,std::string> input "Hello" ;
auto PrintVisitor = [](const auto& t) std::cout << t << "\n"; ;
std::visit(PrintVisitor, input);
所以,我想知道在使用类时如何访问值,因为使用默认数据类型时没有问题?
错误太大,所以我发布了重要部分
19 52 C:\Users\Khusi\Documents\CPP\test2.cpp [Error] no match for 'operator<<' (operand types are 'std::ostream' aka 'std::basic_ostream<char>' and 'const Random')
【问题讨论】:
请发布确切的错误及其发生位置。不用猜测会容易得多。 如错误所示,您尚未为Random
定义operator<<
重载。
@0x5453 你能告诉我怎么做吗?我对此很陌生,我不知道该怎么做。
@SHIVANSHUSAHOO This 问题有一些例子。
@0x5453 谢谢..
【参考方案1】:
访问您的变量input
时,它只接受两种类型:您的类Random
和std::string
,函数PrintVisitor
对变量的每个成员执行一个操作:std::cout << t << "\n";
。所以类 std::string 有一个重载输出运算符,但你的类没有。你需要实现它。
这是一个重载输出运算符的示例:https://docs.microsoft.com/en-us/cpp/standard-library/overloading-the-output-operator-for-your-own-classes?view=vs-2019
【讨论】:
感谢您的帮助以上是关于使用类作为数据类型时如何在 std::variant 中存储值?的主要内容,如果未能解决你的问题,请参考以下文章