Ir ao conteúdo
  • Cadastre-se

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


Marcelo Alexandr

Posts recomendados

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.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...