Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何访问std::variant中存储的类的方法_C++_C++17_Sfml_Variant - Fatal编程技术网

C++ 如何访问std::variant中存储的类的方法

C++ 如何访问std::variant中存储的类的方法,c++,c++17,sfml,variant,C++,C++17,Sfml,Variant,我正在尝试访问std::variant中持有的类的方法。不幸的是,它抛出了以下错误: class ’std::variant<A, int>’ has no member named ‘function’ 类“std::variant”没有名为“function”的成员 代码: A类{ 私人: 整数=0; 公众: A(){}; 虚函数(int i){ 数字+=i; } }; // ... 主。。。 std::variant数组[4][4]; 数组[0][0]=A(){}; 数组[

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

class ’std::variant<A, int>’ has no member named ‘function’
类“std::variant”没有名为“function”的成员
代码:

A类{
私人:
整数=0;
公众:
A(){};
虚函数(int i){
数字+=i;
}
};
// ... 主。。。
std::variant数组[4][4];
数组[0][0]=A(){};
数组[0][0]。函数(3);
我试图阅读文档,但是我仍然不明白如何或是否应该使用std::get()和std::variants.index()访问上述方法

读了一些书后,我试着在循环中做类似的事情:

std::size_t t=array[i][j].index();
std::get<t>(array[i][j]).function();
std::size_t=array[i][j].index();
std::get(数组[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:
注:候选:模板constexpr\u Tp&&std::get(std::variant&&
constexpr内联&u-Tp&get(变量&u-v)
模板参数扣除/替换失败:
是您正在寻找的解决方案

std::get<A>(array[0][0]) = AA();
std::get<A>(array[0][0]).function(3);
使用方法仍然可以相同,或者更安全一些:

std::get<A>(std::get<0>(std::get<0>(array))) = A();
了解


编辑-模板参数推断/替换失败
std::size_t=array[i][j].index();
std::get(数组[i][j]).function();//错误!
不能将非常量值用作模板参数。模板参数在编译期间进行分析,这里的
t
仅在运行时已知。请参阅以下问题:


要初始化
std::variant
中的值,可以使用
std::get
,或者从C++17开始使用:


此外,编译时必须知道
std::get
的模板参数,因此
std::get
t
为变量时,将不起作用。您可以稍微做不同的操作,例如:

std::size_t t = array[0][0].index();
switch (t) {
case 0:
    std::get<0>(array[0][0]).function(3);
case 1:
    // . . .
}
std::size\u t=array[0][0].index();
开关(t){
案例0:
std::get(数组[0][0])。函数(3);
案例1:
// . . .
}

调用get方法,将变量作为参数提供,并指定模板的类

假设您有一个具有x,y坐标的点类 然后std::get(v)将允许您访问变量中的点

std::variant<int, Point> v;
v = 177;
int i = std::get<int>(v);
v = Point(15,18);

try 
{
  Point s = std::get<Point>(v);
  std::cout << s.getX();
}
catch (const std::bad_variant_access&) {}
std::变体v;
v=177;
int i=std::get(v);
v=点(15,18);
尝试
{
点s=标准::获取(v);

std::cout是的,您需要使用
std::get
。变量的活动类型是一个运行时属性,因此不能直接调用变量上的成员函数并期望它们转发给活动成员,因为这样的调用是编译时的事情。在我看来,您似乎正在尝试学习如何在没有H应该有很多关于如何设置和访问变量成员的例子。这是我希望在每一个C++教科书中都会涉及的基本变量用法。不幸的是,StAccOffFuff.com不是一个非常有效的教科书替代品。非常感谢。我在编辑版本中解释了一些新的问题。为什么要用索引代替C?ode>访问
?非常感谢。我有一些新问题,在编辑版本中解释。非常感谢。我有一些新问题,在编辑版本中解释。
std::get<A>(std::get<0>(std::get<0>(array))) = A();
std::get<A>(array.at(0).at(0)) = A();
try {
    std::get<A>(array.at(0).at(0)) = A();
} catch (const std::out_of_range& e) {
    std::cout << e.what() << std::endl;
}
std::size_t t = array[i][j].index();
std::get<t>(array[i][j]).function(); // Error!
array[0][0].emplace<A>();
std::get<A>(array[0][0]).function(3);
std::size_t t = array[0][0].index();
switch (t) {
case 0:
    std::get<0>(array[0][0]).function(3);
case 1:
    // . . .
}
std::variant<int, Point> v;
v = 177;
int i = std::get<int>(v);
v = Point(15,18);

try 
{
  Point s = std::get<Point>(v);
  std::cout << s.getX();
}
catch (const std::bad_variant_access&) {}