是否存在绝对需要typedef的情况

Are there cases where a typedef is absolutely necessary?

本文关键字:typedef 情况 存在 是否      更新时间:2023-10-16

考虑以下安全布尔习惯用法的摘录:

typedef void (Testable::*bool_type)() const;
operator bool_type() const;

是否可以在没有typedef的情况下声明转换函数?以下内容未编译:

operator (void (Testable::*)() const)() const;

啊,我刚刚记住了identity元函数。可以写入

operator typename identity<void (Testable::*)() const>::type() const;

identity的定义如下:

template <typename T>
struct identity
{
    typedef T type;
};

你可能会说identity仍然使用typedef,但这个解决方案对我来说已经足够"好"了

需要typedef的一种情况(与您的问题无关(是在使用时

va_arg()宏。引用C99标准(7.15.1.1(:

类型*va_arg(va_list ap,类型(;

参数类型应为指定的类型名称,以便指向具有指定的类型,只需将a*后缀到即可获得类型

在回答问题标题中的"是否存在typedef是绝对必要的情况?"时,这里有一个需要typedef的例子:

f(unsigned char());   // compiler error!
typedef unsigned char Byte;
f(Byte());            // fine!

请在此处查看结果:http://ideone.com/JPUra

我的分析表明,如果不使用typedef,这是不可能的。编译器将(视为第一个标记,并假设您正在重载() operator,它不应该有任何参数(参数将出现在下一组括号中(。放任何一组额外的括号也没有帮助,但实际上会混淆编译器,从而导致更多的错误。

大多数STL代码都是在typedef从头算之上的,我们应该/必须使用它们!

语法似乎要求在您的案例中使用typedef。转换函数id的形式必须为运算符转化类型id转换类型id不能包含圆括号。因此,在转换为指向函数类型的指针或指向成员函数类型的指示器时,必须使用typedef。

在C++11中,您可以这样做(gcc 4.5.2(:

operator decltype((void (Testable::*)() const)(0))() const ;

我不是说它很漂亮。。。

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();
   }
};

我刚刚遇到了这个问题,带有clang++:

foo.cpp:17:8: error: must use a typedef to declare a conversion to 'void (*(int))()'

并且存在一个C++11 STL模板,该模板覆盖了标识<T>功能:

#include <type_traits>
…
struct foo {
     void bar( ) const { }
     operator std::common_type<void(foo::*)( )const>::type( ) { return &foo::bar; }
};