C++ 如何访问std::variant中存储的类的方法
我正在尝试访问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(){}; 数组[
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&) {}