A typedef
не является макросом, ваш второй пример не эквивалентен первому. В первом случае ваш typedef
определяет функтор, а затем использует этот тип в операторе приведения типа функтора. Во втором случае оператор использует неверный синтаксис, так как оператор не указан, потому что нет типа. Я не уверен, как написать это, но обычно есть способ.
Typedefs на самом деле не нужны, за исключением создания удобочитаемого кода в TMP, и даже тогда это зависит от того, какой вы человек.
Поскольку я не могу придумать альтернативный синтаксис, возможно, в некоторых случаях необходимы typedefs. Я просто подумал о другом, возможно. Скажем, у вас был шаблон со специализациями, который содержал статический метод с типом возврата, как показано ниже:
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(); }
};
Я думаю, что в этом случае вам также понадобится typedef для вызова статического метода независимо от специализации, так как в противном случае метод может запутать компилятор, потому что возвращаемые типы будут отличаться, но это не будет надлежащей перегрузкой.
template <typename T>
struct WhateverUser
{
typename WhateverHandler<T>::rType DoWhatever()
{
return WhateverHandler<T>::template Whatever();
}
};