Ir ao conteúdo
  • Cadastre-se
Entre para seguir isso  
Marcelo Alexandr

Programas utilizando SFINAE estão em conformidade com o padrão ISO C++?

Recommended Posts

Tenho alguns códigos que utilizam SFINAE para eliminar ambiguidades entre funções. A ambiguidade é removida com o uso de SFINAE (Substitution Failure is Not An Error). O problema é que dos compiladores que testei, só consegui compilar esses códigos no gcc-4.6.2. No "DIGITAL MARS 8.52" e no "Open Watcom 1.9" não funcionou. Alguns compiladores até hoje não estão em TOTAL conformidade com o ISO C++. SFINAE é parte do padrão ISO C++98, ISO C++11, ou apenas uma extensão de alguns compiladores? Se fizer parte do padrão ISO C++98 ou ISO C++11, alguém tem o link para o texto? Esta resposta pode ser respondida imediatamente por alguém que conhece o padrão, mas para ilustra segue um código de exemplo que não compilou na maioria dos compiladores que testei, mas compila perfeitamente nos gcc mais novos:


template <bool, class T>
struct enable_if{};

template <class T>
struct enable_if<true, T>
{
typedef T typ;
};

template<class From,class To> struct is_convertible
{
struct aux//struct para corrigir limitações em alguns compiladores
{
static char fTo(...);
static double fTo(const To&);
static const From& fFrom();
};
static const bool value = sizeof( aux::fTo( aux::fFrom() ) ) == sizeof(double);
};

class Base{};
class Derived: public Base{};

int operator+(const Base&,const Base&){return 0;}

template<class T>
typename enable_if<!is_convertible<T,Base>::value,int>::typ
operator+(const Base&,const T&){return 0;}//Compila apenas quando parâmetro à direita da soma à classe "Base"

template<class T>
typename enable_if<!is_convertible<T,Base>::value,int>::typ
operator+(const T&,const Base&){return 0;}//Compila apenas quando parâmetro à esquerda da soma à classe "Base"


int main()
{
Derived X;

X+X;//Ambiguidade entre as outras 2 versões do operador "+" removida com "SFINAE"
X+1;
1+X;

return 0;
}

Nota: Implementei minhas próprias versões de "is_convertible" e "enable_if" para não ser necessário o uso de bibliotecas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora
Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×