C++ 如何将variant的元素转换为std::string(c+;+;)

C++ 如何将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的元素转换成字符串。 我尝试了很多方法。但一切都不起作用

如何将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的元素转换成字符串。 我尝试了很多方法。但一切都不起作用。 我知道我可以通过
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::cout
std::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吗?@hour30000
std::detacy\t
提供基本数据类型,删除常量和引用。这使得
std::visit
f中的比较更容易函数调用。你救了我。谢谢!!你能告诉我为什么需要std::detaci\u t吗?@hour30000
std::detaci\u t
提供基本数据类型,删除常量和引用。这使得在
std::visit
函数调用中比较更容易。