Я хочу заменить boost::variant
на С++ 17 std::variant
и избавиться от boost::recursive_wrapper
, чтобы полностью удалить зависимость от boost в следующем коде. Как я могу это сделать?
#include <boost/variant.hpp>
#include <type_traits>
using v = boost::variant<int, boost::recursive_wrapper<struct s> >;
struct s
{
v val;
};
template<template <typename...> class R, typename T, typename ... Ts>
auto reduce(T t, Ts ... /*ts*/)
{
return R<T, Ts...>{t};
}
template<typename T, typename F>
T adapt(F f)
{
static_assert(std::is_convertible_v<F, T>, "");
return f;
}
int main()
{
int val1 = 42;
s val2;
auto val3 = adapt<v>(reduce<boost::variant>(val1, val2));
}
Существуют две общие функции: первая функция reduce
выбирает во время выполнения, какой аргумент возвращает (здесь он просто возвращает первый аргумент для краткости), вторая функция adapt
преобразует значение типа F в значение типа T.
В этом примере reduce
возвращает объект типа boost::variant<int, s>
, который затем преобразуется в объект типа boost::variant<int, boost::recursive_wrapper<s> >
.