Eu me deparei com um desafio estranho ao tentar definir um tipo com base em uma matriz enquanto escrevia um código de vinculação de biblioteca.
Considere uma enumeração como a seguinte:
enum class MyTypes
{
UInt,
Int,
Float
}
Com algumas características de tipo, posso converter um valor da enumeração em um tipo:
template <MyTypes Ty> struct typeify;
template <> struct typeify<MyTypes::UInt> { using type = unsigned int; };
template <> struct typeify<MyTypes::Int> { using type = int; };
template <> struct typeify<MyTypes::Float> { using type = float; };
template <MyTypes Ty> using typeify_t = typename typeify<Ty>::type;
Para ajudar com a vinculação, também tenho isso (porque C++ não tem reflexão):
inline static constexpr std::array KnownTypes
{
std::pair{"UInt", MyTypes::UInt},
std::pair{"Int", MyTypes::Int},
std::pair{"Float", MyTypes::Float}
};
A partir daqui, quero definir um std::variant
com base nos meus tipos conhecidos.
Com 3 valores, o óbvio é escrever a variante assim:
std::variant<unsigned int, int, float>
Mas, na minha situação, tenho mais de 50 tipos. Então, eu gostaria de uma maneira de gerar automaticamente a definição de tipo para o std::variant
from the array of KnownTypes
e o typeify_t
type trait.
Acho que cheguei perto com o seguinte, mas fiquei bloqueado por não conseguir dar um valor padrão a um parâmetro de modelo variádico:
template <template <typename T, T ... Idx> class temp = std::make_index_sequence<KnownTypes.size()>>
using AnyKnownType = std::variant<typeify_t<KnownTypes[Idx].second>, ...>;