在std ::访问中获得主动价值,而又不知道哪个值是活动的
Getting active value in std::visit without knowing which value is active
我想在std ::变体中获取活动值,而又不知道哪一个活动。我以为我可以编写一个模板访问者并使用std ::访问,但它不起作用。
#include <variant>
#include <string>
#include <iostream>
struct Visit_configuration {
template<typename Data_type>
Data_type operator()(Data_type& t) const
{
return t;
}
};
int main()
{
std::variant<int, std::string> v;
v = "hello";
std::cout << std::visit(Visit_configuration(), v); // expect "hello"
std::cin.get();
}
MSVC不会编译并投掷:
错误C2338:访问()需要所有潜在调用的结果 具有相同的类型和值类别(N4741 23.7.7 [variant.visit]/2)。
注意:请参阅函数模板实例化'int参考 std ::访问&amp;,0>(_可呼叫 &amp;&amp;,std :: variant&amp;)'被编译
那么如何解决此问题?
编辑:我想也可能使用其他值来用于其他值
问自己一个问题:
如果您不知道variant
的哪个部分是活动的std::visit
的返回类型是什么?
这是编译器必须答案的问题。答案不能是"取决于" - 您(如在编译器中)必须在编译时决定。visit
调用可能在运行时返回不同类型。
如果您想使用不同类型的"在运行时"工作,则必须在要使用的类型上的函数中。换句话说,必须有不同的函数(或函数模板实例化)来处理"将int写入 cout
"answers"将字符串写入 cout
"情况。您不能以相同的(非策略)函数来执行此操作。
因此,此处的直接解决方案是将std::cout <<
放入您的模板访问者功能 - 这是访问的重点:指定每种情况下应该发生的事情。
如果您想"将获得的值也可能用于[某些]其他[目的]",则"其他目的"也应成为/a访问者的一部分。只有这样,您才能使"其他目的"一次处理不同的情况(例如,在模板函数中)。否则,您必须在编译时确定哪种类型应使用 - 编译器将不会在以后的(运行时间)打开该选择。
访问者函数的返回类型应相同。
而是创建打印机访问者:
struct PrinterVisitor {
template<typename T>
void operator()(const T& t) const
{
std::cout << t;
}
};
int main()
{
std::variant<int, std::string> v;
v = "hello";
std::visit(PrinterVisitor{}, v); // expect "hello"
}
,在您的情况下,您甚至可以拥有lambda:
int main()
{
std::variant<int, std::string> v;
v = "hello";
std::visit([](const auto& t){std::cout << t;}, v); // expect "hello"
}
- 努力将整数转换为链表。不知道我在这里做错了什么
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 叮当不知道PTRDIFF_MAX?
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 我正在尝试使用 c++ 创建一个货币转换程序,我不知道如何继续
- 不知道某个东西是否被忽略会引入未定义的行为吗
- 如何在C++中读取空格分隔的输入 当我们不知道输入的数量时
- 我不知道这条线是做什么的
- 如何在不知道C++中有多少可选参数的情况下在循环中使用va_arg?
- 在不知道套接字的情况下关闭网络连接
- 如果我不知道每个列表中有多少个数字,我如何将给定数量的数字列表作为输入?
- 我不知道导致错误的原因 (C3074)
- 我不知道为什么这段代码会让核心被转储?
- 我正在尝试制作一个自平衡机器人,但编译时存在错误。我不知道如何解决它
- 循环通过网格获取温度,但不知道如何告诉程序停止循环
- 如何在不知道对应关系的情况下在字符串中搜索字符并将其分配给另一个字符?
- 反转字符串.不知道为什么这个逻辑是错误的.C++
- 不知道如何在家庭作业任务中实现一件事
- 在std ::访问中获得主动价值,而又不知道哪个值是活动的