Estou tentando definir uma função usando modelos e quero que o nome do tipo seja int ou anEnum (uma enumeração específica que eu havia definido). Eu tentei o seguinte, mas falhei:
template <int | anEnum T> // or <int T, anEnum T> or <int, anEnum T>
bool isFunction(const T &aVariable){}
O que estou tentando fazer é usar modelos, em vez de definir duas funções sobrecarregadas. Prefiro que a função seja chamada da seguinte forma, sem que o programador precise considerar o tipo
isFunction(aVariable) // and not isFunction<int> (aVariable) nor isFunction<anEnum> (aVariable)
Basicamente, eu quero que essa função seja modelada para os tipos int e aNum. Eu procurei por isso, mas não consegui encontrar a resposta. O que posso estar faltando? Obrigado,
false
para outros tipos ou não instanciar a função para outros tipos.Respostas:
Além da resposta que não seja C ++ 20, se você puder, por acaso, usar o C ++ 20 e seu
concepts
recurso, sugiro a seguinte implementação:Demo
ATUALIZAR
De acordo com o comentário de @RichardSmith , aqui está uma abordagem mais escalável e reutilizável:
fonte
template<typename T, typename ...U> concept one_of = (std::is_same_v<T, U> || ...);
template<one_of<int, MyEnum> T> bool isFunction(T const& aVariable) {
Existem algumas maneiras de conseguir isso. Todos envolvem o uso do
type_traits
cabeçalho. Você pode afirmar estática nos tipos em questão no corpo da função, por exemplo.Ou, se você precisar considerar essa função entre outras sobrecargas, uma técnica SFINAE pode ser empregada.
Isso removerá a função de um conjunto de sobrecargas antes de ser chamada se os tipos não corresponderem. Mas se você não precisar desse comportamento, uma asserção estática permitirá uma mensagem de erro mais amigável ao programador.
fonte
E essa solução? Um código com a função será compilado se o tipo T atender às suas solicitações. Caso contrário, a asserção estática falhou.
fonte
isFunction(std::string_view)
). A assinatura ainda será uma correspondência válida, mas a instanciação causa erro.Melhorei a https://stackoverflow.com/a/60271100/12894563 resposta. 'Se constexpr' pode ajudar nessa situação:
A função isFunction (1L) falhará porque não há função sobrecarregada ou ramificação 'if constexpr'.
UPDATE: Corrigida falta
https://godbolt.org/z/eh4pVn
fonte
static_assert(false, ...)
é uma notificação de falha na entrega mal formada, sem sequer ser usada. Se você tiver sorte, seu compilador lhe dirá imediatamente, como Clang, godbolt.org/z/m_Gk9n