Информация об изменениях

Сообщение Вопрос по std::variant от 06.06.2025 11:57

Изменено 06.06.2025 12:11 pva

Вопрос по std::variant
Привет,

воткнул тут с примером с cppref.
template<class... Ts>
struct overloaded : Ts... { using Ts::operator()...; };
...
for (auto& v: vec) {
  std::visit(overloaded{
    [](auto arg) { std::cout << arg << ' '; },
    [](double arg) { std::cout << std::fixed << arg << ' '; },
    [](const std::string& arg) { std::cout << std::quoted(arg) << ' '; }
  }, v);
}


А можно ли сделать подобное для бинарных операций?
using value_t = std::variant<int, long, double, std::string>;
...
// как должна выглядеть applyOp чтобы можно было записать?
value_t operator+(const value_t& l, const value_t& r) {
  return applyOp(l, r, overloaded {
    [](const auto& l, const auto& r) { return l + r; },
    [](const std::string& l, const auto& r) { return l + std::to_string(r); }
  });
}
Вопрос по std::variant
Привет,

воткнул тут с примером с cppref.
template<class... Ts>
struct overloaded : Ts... { using Ts::operator()...; };
...
for (auto& v: vec) {
  std::visit(overloaded{
    [](auto arg) { std::cout << arg << ' '; },
    [](double arg) { std::cout << std::fixed << arg << ' '; },
    [](const std::string& arg) { std::cout << std::quoted(arg) << ' '; }
  }, v);
}


А можно ли сделать подобное для бинарных операций?
using value_t = std::variant<int, long, double, std::string>;
...
// как должна выглядеть applyOp чтобы можно было записать?
value_t operator+(const value_t& l, const value_t& r) {
  return applyOp(l, r, overloaded {
    [](const auto& l, const auto& r) { return l + r; },
    [](const std::string& l, const auto& r) { return l + std::to_string(r); }
  });
}


p.s. Отвечу сам себе
value_t operator+(const value_t& l, const value_t& r) {
  return std::visit(overloaded {
    [](const auto& l, const auto& r) { return l + r; },
    [](const std::string& l, const auto& r) { return l + std::to_string(r); }
  }, l, r);
}