Eu tenho um modelo de função que leva muitos tipos diferentes como entrada. Fora desses tipos, apenas um deles tem uma getInt()
função. Portanto, eu quero que o código execute a função apenas para esse tipo. Por favor, sugira uma solução. obrigado
#include <type_traits>
#include <typeinfo>
class X {
public:
int getInt(){
return 9;
}
};
class Y{
};
template<typename T>
void f(T& v){
// error: 'class Y' has no member named 'getInt'
// also tried std::is_same<T, X>::value
if(typeid(T).name() == typeid(X).name()){
int i = v.getInt();// I want this to be called for X only
}
}
int main(){
Y y;
f(y);
}
type_info
estrutura possui um operador de comparação de igualdade , portanto,typeid(T) == typeid(X)
deve funcionar também.if constexpr
com condiçãois_same_v<T,X>
.getInt
membro que pode ser chamado . Deve haver algumas perguntas aqui apenas no stackoverflow.com sobre como ver se uma estrutura ou classe tem uma função de membro específica, se você apenas pesquisar um pouco.Respostas:
Se você deseja chamar uma função
f
para todos os tipos que possuem membros da funçãogetInt
, não apenasX
, você pode declarar 2 sobrecargas para a funçãof
:para tipos que possuem
getInt
função de membro, incluindo classeX
para todos os outros tipos, incluindo classe
Y
.Solução C ++ 11 / C ++ 17
Tendo isso em mente, você pode fazer algo assim:
Confira ao vivo .
Observe que
std::void_t
é introduzido no C ++ 17, mas se você estiver limitado ao C ++ 11, é realmente fácil de implementarvoid_t
por conta própria:E aqui está a versão C ++ 11 ao vivo .
O que temos em C ++ 20?
O C ++ 20 traz muitas coisas boas e uma delas é o conceito . Acima do que é válido para C ++ 11 / C ++ 14 / C ++ 17 pode ser reduzido significativamente em C ++ 20:
Confira ao vivo .
fonte
void_t
causa problemas para algum compilador antigo (conforme apontado pelo link).template<typename T> concept HasGetInt = requires (T& v) { {v.getInt()} -> std::convertible_to<int>; };
Você pode usar
if constexpr
do C ++ 17:Antes, você precisará usar sobrecargas e SFINAE ou envio de tags.
fonte
if constexpr
é um recurso do C ++ 17.X
Mantenha-o simples e sobrecarregado. Funcionou desde pelo menos C ++ 98 ...
Isso é suficiente se houver apenas um tipo com
getInt
função. Se houver mais, não é mais tão simples. Existem várias maneiras de fazer isso, aqui está uma:Exemplo ao vivo com saída de diagnóstico.
fonte
X
), mas, se houvesse mais tipos semelhantes de membrosgetInt
no futuro, essa não é uma boa prática. Você provavelmente quer observar que