Como por um determinado tipo de variante
using V = std::variant<bool, char, std::string, int, float, double, std::vector<int>>;
declarar dois tipos de variantes
using V1 = std::variant<bool, char, int, float, double>;
using V2 = std::variant<std::string, std::vector<int>>;
de onde V1
inclui todos os tipos aritméticos de V
e V2
inclui todos os tipos não-aritméticos de V
?
V
pode ser um parâmetro de uma classe de modelo, por exemplo:
template <class V>
struct TheAnswer
{
using V1 = ?;
using V2 = ?;
};
em geral, os critérios podem ser uma constexpr
variável como esta:
template <class T>
constexpr bool filter;
c++
c++17
std-variant
Alexey Starinsky
fonte
fonte
Types...
dentrostd::variant
diretamente, como este ?std::variant
está mal formado.std::variant<>
é mal formada, então estou livre. Vou ajustá-lo para issoV1
eV2
voltar aostd::variant<std::monostate>
pensamento.Com o Boost.Mp11 , este é um one-liner curto (como sempre):
Você também pode usar:
para tornar os dois mais simétricos.
Alternativamente,
fonte
mp_filter
baseia?EDIT Dado que uma variante vazia (
std::variant<>
) está mal formada (de acordo com cppreference ) e que deve ser usadastd::variant<std::monostate>
, modifiquei a resposta (adicionei umatuple2variant()
especialização para tupla vazia) para dar suporte ao caso em que a lista de tipos paraV1
ouV2
está vazia.É um pouco de
decltype()
delírio, mas ... se você declarar algumas funções de filtro auxiliar da seguinte maneirae uma função tupla para variante (com uma especialização para tuplas vazias, para evitar uma vazia
std::variant
)sua classe simplesmente (?) se torna
Se você quiser algo mais genérico (se desejar passar
std::arithmetic
como parâmetro de modelo), poderá modificar afilterArithm()
função que passa por um parâmetro de filtro de modelo-modeloF
(renomeadofilterType()
)A
TheAnswer
turma se tornae a
TA
declaração tambémstd::is_arithmetic
A seguir, é apresentado um exemplo completo de compilação com
std::is_arithmetic
como parâmetro e umV2
caso vaziofonte
void
.void
, até onde eu sei, é proibido como digitar astd::variant
.std::variant<void>
é mal formado, mas parece questd::variant<>
está bem se sua definição não for instanciada .