A typedef
no es una macro, su segundo ejemplo no es equivalente al primero. En el primer caso, su typedef
está definiendo un functor y luego usando ese tipo en un operador de conversión del tipo de functor. En el segundo, el operador está utilizando una sintaxis mala ya que no se ha especificado ningún operador porque no hay ningún tipo. No estoy seguro de cómo escribirlo, pero por lo general hay una manera.
Los typedefs no son realmente necesarios, excepto para hacer código legible para humanos en TMP e incluso eso depende del tipo de humano que sea.
Como no puedo encontrar la sintaxis alternativa, tal vez los typedefs sean necesarios en algunos casos. Solo pensé en otro posiblemente. Supongamos que tenía una plantilla con especializaciones que contenía un método estático con un tipo de retorno, como a continuación:
template <typename T>
struct WhateverHandler
{
typedef T rType;
static rType Whatever() { return rType(); }
};
template <>
struct WhateverHandler<std::string>
{
typedef std::string rType;
static rType Whatever() { return rType(); }
};
creo que en este caso también se podría necesitar el typedef con el fin de llamar al método estático independientemente de su especialización como de lo contrario el método podría confundir al compilador porque los tipos de devolución diferirían pero no sería una sobrecarga adecuada.
template <typename T>
struct WhateverUser
{
typename WhateverHandler<T>::rType DoWhatever()
{
return WhateverHandler<T>::template Whatever();
}
};
¿por qué se declarará la función sin el typedef? –
¿Es absolutamente necesaria la conversión a bool seguro? –
@Tad: parece útil en mi caso particular (una plantilla de clase 'opcional'). –
fredoverflow