c++ - 如何访问存储在 std::variant 中的类的方法

标签 c++ c++17 sfml variant

我正在尝试访问 std::variant 中保存的类的方法。不幸的是它抛出以下错误:

class ’std::variant<A, int>’ has no member named ‘function’

代码:

class A {
private:
    int number = 0;
public:
    A() {};
    void function(int i) {
        number += i;
    }
};

// ... main ...
std::variant<A,B> array[4][4];

array[0][0] = A(){};
array[0][0].function(3);

我试图阅读文档,但我仍然不明白我应该如何或是否应该使用 std::get() 和 std::variants.index() 来访问上述方法。

经过一些阅读后,我尝试在循环中做这样的事情:

std::size_t t=array[i][j].index();
std::get<t>(array[i][j]).function();

但还是不行。错误是:

note: candidate: template<class _Tp, class ... _Types> constexpr _Tp&& std::get(std::variant<_Types ...>&&)
     constexpr inline _Tp&& get(variant<_Types...>&& __v)

template argument deduction/substitution failed:

最佳答案

std::variant中初始化一个值你可以使用 std::get ,或自 C++17 起, emplace() :

array[0][0].emplace<A>();

要访问值,请使用 std::get :

std::get<A>(array[0][0]).function(3);

此外,std::get 的模板参数必须在编译时知道,所以 std::get<t>什么时候t是一个变量,将不起作用。你可以稍微不同地做,例如像这样:

std::size_t t = array[0][0].index();
switch (t) {
case 0:
    std::get<0>(array[0][0]).function(3);
case 1:
    // . . .
}

关于c++ - 如何访问存储在 std::variant 中的类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62593966/

相关文章:

c++ - Qt WEBKIT 与 CMake

c++ - Code::Blocks 可执行文件没有纹理

c++ - SFML View setCenter 与旋转

c++ - “这”为0xDDDDDDDD:弹出堆栈时发生读取访问冲突

c++ - 使用 decltype : work on g++ but not on Visual C++ 显式实例化函数

c++ - 如何输出带有正号和前面零的整数

c++ - C++中的大数字库

c++ - 在 C++ 中使用保留字

c++ - 使用observer_ptr

c++ - 如何在 std::unordered_map<std::wstring, T> 中通过 std::wstring_view 类型的键查找?