Как преобразовать значение std::variant в std::string с помощью std::visit

#c #stl #c 17 #std

#c #stl #c 17 #ЗППП

Вопрос:

Я хочу преобразовать значение std::variant в std::string , но этот код не работает:

 using AnyType = std::variant <bool, char, integer, double, std::string, std::vector <AnyType>/*, Object, Extern, InFile*/>;

struct AnyGet {
    AnyGet() {}

    std::string operator()(std::stringamp; result, const boolamp; _ctx) { return _ctx ? "true" : "false"; }
    std::string operator()(std::stringamp; result, const charamp; _ctx) { return std::string(1, _ctx); }
    std::string operator()(std::stringamp; result, const integeramp; _ctx) { return std::to_string(_ctx); }
    std::string operator()(std::stringamp; result, const doubleamp; _ctx) { return std::to_string(_ctx); }
    std::string operator()(std::stringamp; result, const std::stringamp; _ctx) { return _ctx; }
    std::string operator()(const std::vector <AnyType>amp; _ctx, const std::stringamp; _nl = "n") {/*This depends on to_string*/}
};

std::string to_string(const AnyTypeamp; _input, const std::stringamp; _new_line){
    std::visit(/*I don't know, what I must write here*/);
}
 

Я хочу преобразовать, например, это: (в коде) AnyType some = true; в (в консоли) true .

Итак, может ли кто-нибудь помочь мне с этим?

Комментарии:

1. Почему бы не использовать std::any вместо вашего варианта, в котором перечислено слишком много типов IMO? Какую основную проблему это должно решить? Для чего нужен вариант использования AnyType ?

Ответ №1:

Рабочий пример:

 using AnyType = std::variant<bool, char, int, double, std::string>;

struct AnyGet {
    std::string operator()(bool value) { return value ? "true" : "false"; }
    std::string operator()(char value) { return std::string(1, value); }
    std::string operator()(int value) { return std::to_string(value); }
    std::string operator()(double value) { return std::to_string(value); }
    std::string operator()(const std::stringamp; value) { return value; }
};

std::string to_string(const AnyTypeamp; input) {
    return std::visit(AnyGet{}, input);
}
 

std::vector<std::variant<...>> в качестве одного из std::variant<...> членов требуется использование рекурсивного типа variant, который не поддерживается std::variant , но поддерживается boost::variant .

Ответ №2:

Я нахожу ответ @maxin немного более самодостаточным:

 typedef std::variant<unsigned int, double, float, int> VariableData;
typedef std::tuple<unsigned int, VariableData> Variable;//UID, Data
struct VisitPrintVariable
{
   void operator()(unsigned int value) { std::cout << std::to_string(value); }
   void operator()(double value) { std::cout << std::to_string(value); }
   void operator()(float value) { std::cout << std::to_string(value); }
};

static void PrintVariable(VariableDataamp; vd)
{
    std::visit(VisitPrintVariable(), vd);
}
 

Комментарии:

1. Интересно , есть ли какая — нибудь причина для негативного комментария ?.