Cómo por un tipo de variante dado
using V = std::variant<bool, char, std::string, int, float, double, std::vector<int>>;
declarar dos tipos de variantes
using V1 = std::variant<bool, char, int, float, double>;
using V2 = std::variant<std::string, std::vector<int>>;
donde V1incluye todos los tipos aritméticos de Ve V2incluye todos los tipos no aritméticos de V?
V puede ser un parámetro de una clase de plantilla, por ejemplo:
template <class V>
struct TheAnswer
{
using V1 = ?;
using V2 = ?;
};
en general los criterios pueden ser una constexprvariable como esta:
template <class T>
constexpr bool filter;
c++
c++17
std-variant
Alexey Starinsky
fuente
fuente

Types...el interiorstd::variantdirectamente, como esta ?std::variantestá mal formado.std::variant<>está mal formada, así que estoy claro. Voy a ajustar de modo queV1yV2caer de nuevo astd::variant<std::monostate>pesar.Con Boost.Mp11 , este es un breve resumen (como siempre):
También puedes usar:
para hacer los dos más simétricos.
Alternativamente,
fuente
mp_filterbasa esto ?EDITAR Dado que una variante vacía (
std::variant<>) está mal formada (según cppreference ) y que debería usarse en sustd::variant<std::monostate>lugar, he modificado la respuesta (agregué unatuple2variant()especialización para tuplas vacías) para admitir el caso cuando la lista de tipos paraV1oV2está vacía.Es un pequeño
decltype()delirio pero ... si declaras un par de funciones de filtro auxiliar de la siguiente maneray una función tupla a variante (con una especialización para tuplas vacías, para evitar un vacío
std::variant)tu clase simplemente (?) se convierte
Si desea algo más genérico (si desea pasar
std::arithmeticcomo parámetro de plantilla), puede modificar lafilterArithm()función pasando un parámetro de filtro de plantilla-plantillaF(renombradofilterType())La
TheAnswerclase se conviertey la
TAdeclaración toma tambiénstd::is_arithmeticEl siguiente es un ejemplo completo de compilación con un
std::is_arithmeticparámetro y unV2caso vacíofuente
void.void, que yo sepa, está prohibido como tipo en astd::variant.std::variant<void>está mal formado, pero parece questd::variant<>está bien si su definición no se instancia .