使用类作为数据类型时如何在 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&lt;&lt; 重载。 @0x5453 你能告诉我怎么做吗?我对此很陌生,我不知道该怎么做。 @SHIVANSHUSAHOO This 问题有一些例子。 @0x5453 谢谢.. 【参考方案1】:

访问您的变量input 时,它只接受两种类型:您的类Randomstd::string,函数PrintVisitor 对变量的每个成员执行一个操作:std::cout &lt;&lt; t &lt;&lt; "\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 中存储值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python-dbus 中将类作为数据类型处理

使用另一个类作为返回类型的类?

打字稿,如何使用类作为参数的类型

使用“类”数据类型时,如何指定类型以便只接受特定类的子类?

如何在 Ocaml 中使用类中定义的类型作为 val?

使用数据库时如何使用 Anylogic 对象 (INode) 作为类型