C++ 如何将variant的元素转换为std::string(c+;+;)
如何将variant的元素转换为std::stringC++ 如何将variant的元素转换为std::string(c+;+;),c++,c++17,C++,C++17,如何将variant的元素转换为std::string void Function(const std::string str) { ~~ } std::variant<std::string, int, float> a{ 32 }; void函数(const std::string str) { ~~ } std::变体a{32}; 我应该将a的元素传递给函数。 我不能改变函数的参数。我不想添加任何辅助函数 我只想把a的元素转换成字符串。 我尝试了很多方法。但一切都不起作用
void Function(const std::string str)
{
~~
}
std::variant<std::string, int, float> a{ 32 };
void函数(const std::string str)
{
~~
}
std::变体a{32};
我应该将a的元素传递给函数。
我不能改变函数的参数。我不想添加任何辅助函数
我只想把a的元素转换成字符串。
我尝试了很多方法。但一切都不起作用。
我知道我可以通过std::get(a)
,std::get(a)
,std::get(a)
但我需要很多try-catch语句来实现这一点
我想知道更聪明的方法。要获取变体的活动元素,无论其类型如何,请使用
visit
。为了访问变量,您需要一个可以接受所有包含类型的模板函数。该模板可以将参数转换为字符串,例如使用std::to_string
,并将其作为参数传递给函数
以获取变量的活动元素,无论其类型如何,请使用访问
。为了访问变量,您需要一个可以接受所有包含类型的模板函数。该模板可以将参数转换为字符串,例如使用std::to_string
,并将其作为参数传递给函数您可以使用std::visit
和一些if constexpr
s。如果变量包含字符串,则不需要转换;只需调用函数
。否则,使用std::to_string
转换数值参数:
#include <iostream>
#include <string>
#include <variant>
template<class> inline constexpr bool always_false_v = false;
void Function(const std::string str)
{
std::cout << str << std::endl;
}
int main()
{
std::variant<std::string, int, float> a{ 32 };
std::visit([](auto&& arg) {
using T = std::decay_t<decltype(arg)>;
if constexpr (std::is_same_v<T, std::string>)
return Function(arg);
else if constexpr (std::is_arithmetic_v<T>)
return Function(std::to_string(arg));
else
static_assert(always_false_v<T>, "non-exhaustive visitor!");
}, a);
return 0;
}
#包括
#包括
#包括
模板内联constexpr bool始终\u false\u v=false;
void函数(const std::string str)
{
std::cout如果constepr
s,您可以将std::visit
与一些一起使用。如果变量包含字符串,则无需进行转换;只需调用函数
。否则,使用std::to_string
转换数值参数:
#include <iostream>
#include <string>
#include <variant>
template<class> inline constexpr bool always_false_v = false;
void Function(const std::string str)
{
std::cout << str << std::endl;
}
int main()
{
std::variant<std::string, int, float> a{ 32 };
std::visit([](auto&& arg) {
using T = std::decay_t<decltype(arg)>;
if constexpr (std::is_same_v<T, std::string>)
return Function(arg);
else if constexpr (std::is_arithmetic_v<T>)
return Function(std::to_string(arg));
else
static_assert(always_false_v<T>, "non-exhaustive visitor!");
}, a);
return 0;
}
#包括
#包括
#包括
模板内联constexpr bool始终\u false\u v=false;
void函数(const std::string str)
{
std::coutstd::variant
不是这样工作的。它不是将类型相互转换的魔杖。它只是一个容器,可以存储指定类型之一的单个对象。要将int
转换为string
可以使用,也可以向后转换。std::variant
不是这样工作的。将类型相互转换并不是一根神奇的魔杖。它只是一个容器,可以存储指定类型之一的单个对象。要将int
转换为string
您可以使用,并且可以向后转换。讽刺的是std::visit
是一个帮助函数。也许OP愿意使用帮助函数我试过[](auto&&v){std::string{v}~~~~},但是没有用,因为在visitor函数中v的类型是未知的,类型是已知的。类型是decltype(v)
。它不起作用,因为你不能像那样将int或float转换为string。请看我的答案以获得建议。具有讽刺意味的是,std::visit
是一个帮助函数。也许OP愿意使用为他们编写的帮助函数。你能告诉我如何使用visit with template函数吗?我尝试了[](auto&&v){std::string{v}~~}但是它不起作用,因为v的类型在visitor函数中是未知的,类型是已知的
。它不起作用,因为你不能像那样将int或float转换成string。请看我的答案以获得建议。你可以救我。谢谢!!你能告诉我为什么需要std::detacy\t吗?@hour30000std::detacy\t
提供基本数据类型,删除常量和引用。这使得std::visit
f中的比较更容易函数调用。你救了我。谢谢!!你能告诉我为什么需要std::detaci\u t吗?@hour30000std::detaci\u t
提供基本数据类型,删除常量和引用。这使得在std::visit
函数调用中比较更容易。