typedef
не является макросом, ваш второй пример не эквивалентен первому. В первом случае ваш typedef
определяет функтор, а затем использует этот тип в операторе приведения типа функтора. Во втором случае оператор использует неверный синтаксис, так как оператор не указан, потому что нет типа. Я не знаю, как это написать, но обычно способ есть.
Typedef на самом деле не нужен, за исключением создания удобочитаемого кода в TMP, и даже тогда это зависит от того, какой вы человек.
Поскольку я не могу придумать альтернативный синтаксис, возможно, в некоторых случаях необходимы typedef. Я просто подумал, возможно, о другом. Допустим, у вас есть шаблон со специализациями, который содержит статический метод с возвращаемым типом, как показано ниже:
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();
}
};
person
AJG85
schedule
09.08.2011
optional<T>
). - person fredoverflow   schedule 09.08.2011typedef
помогает создавать более читаемый код / ошибки. - person Matthieu M.   schedule 09.08.2011template <typename T> using id = T;
нет в стандартной библиотеке, верно? :( - person fredoverflow   schedule 10.08.2011