Jak według danego typu wariantu
using V = std::variant<bool, char, std::string, int, float, double, std::vector<int>>;
zadeklaruj dwa typy wariantów
using V1 = std::variant<bool, char, int, float, double>;
using V2 = std::variant<std::string, std::vector<int>>;
gdzie V1
obejmuje wszystkie typy arytmetyczne z V
i V2
obejmuje wszystkie typy arytmetyczne z V
?
V
może być parametrem klasy szablonów, na przykład:
template <class V>
struct TheAnswer
{
using V1 = ?;
using V2 = ?;
};
ogólnie kryteria mogą być constexpr
zmienne takie jak ta:
template <class T>
constexpr bool filter;
c++
c++17
std-variant
Aleksiej Stariński
źródło
źródło
Types...
wewnątrzstd::variant
bezpośrednio, jak to ?std::variant
jest źle ukształtowany.std::variant<>
jest źle sformułowane, więc nie mam wątpliwości. Zmodyfikuję go tak, abyV1
iV2
wrócił dostd::variant<std::monostate>
tego.W przypadku Boost.Mp11 jest to krótki linijka (jak zawsze):
Możesz także użyć:
aby dwa były bardziej symetryczne.
Alternatywnie,
źródło
mp_filter
opiera?EDYCJA Biorąc pod uwagę, że pusty wariant (
std::variant<>
) jest źle sformułowany (zgodnie z preferencją cp ) i powinienem go użyćstd::variant<std::monostate>
, zmodyfikowałem odpowiedź (dodałemtuple2variant()
specjalizację dla pustej krotki), aby obsługiwała przypadek, gdy lista typów dlaV1
lubV2
jest pusta.To trochę
decltype()
majaczenie, ale ... jeśli zadeklarujesz kilka filtrów pomocniczych w następujący sposóboraz funkcja krotki do wariantu (ze specjalizacją dla pustych krotek, aby uniknąć pustej
std::variant
)twoja klasa po prostu (?) się
Jeśli chcesz mieć coś bardziej ogólnego (jeśli chcesz przekazać
std::arithmetic
jako parametr szablonu), możesz zmodyfikowaćfilterArithm()
funkcję, przekazując parametr filtru szablonu-szablonuF
(przemianowanyfilterType()
)TheAnswer
Klasa staći
TA
deklaracja równieżstd::is_arithmetic
Poniżej znajduje się pełny przykład kompilacji z
std::is_arithmetic
parametrem as iV2
pustą wielkością literźródło
void
.void
, o ile wiem, zabronione jest wpisywaniestd::variant
.std::variant<void>
jest źle sformułowane, ale wydaje sięstd::variant<>
być w porządku, jeśli jego definicja nie zostanie utworzona .