是否存在绝对需要typedef的情况
Are there cases where a typedef is absolutely necessary?
考虑以下安全布尔习惯用法的摘录:
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; }
};
- C++:TypeDef使用元组
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 函数中堆分配的效果与缺少堆分配的情况
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 如何在没有信号的情况下从C++执行QML插槽
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 为什么在某些情况下不写入此文件?
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- "使用"可以在所有情况下完全取代"typedef"吗?
- 在没有"typedef"的情况下,如何创建用于 c# 泛型的相关类型组?
- 易失性指针指向函数,在没有 typedef 的情况下使用时显示编译错误;需要帮助"void (* volatile userFunc)(void)"
- 是否存在绝对需要typedef的情况