博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[EMC++] Item 9. Prefer alias declarations to typedefs
阅读量:6455 次
发布时间:2019-06-23

本文共 1892 字,大约阅读时间需要 6 分钟。

条款九 倾向使用别名声明而非typedef

简介

C++98中可以使用typedef简化定义:

typedef std::unique_ptr
> UPtrMapSS;

C++11中提供了别名声明(alias declarations)的方式:

using UPtrMapSS = std::unique_ptr
>;

这两种方式实现了相同的功能,但是在处理函数指针的时候后者更容易被理解。

typedef void(*FP)(int, const std::string&); // typedefusing FP = void(*)(int, const std::string&); // alias declaration

倾向使用别说声明的强烈原因是,别名声明可以模板化,而typedef不行

案例

以下例子定义一个使用自定义分配器MyAlloc的链表的同义词:

// alias declarationtemplate
using MyAllocList = std::List
>;MyAllocList
lw;// typedeftemplate
struct MyAllocList{ typedef std::List
> type;};MyAllocList
::type lw;

若要在一个模板内定义一个链表:

// typedeftemplate
class Widget { typename MyAllocList
::type list;};// alias declarationtemplate
class Widget { MyAllocList
list;};

当编译器遇到使用MyAllocList&lt;T>的时候,它知道MyAllocList<T>是一种类型,因为MyAllocList是别名模板:它必须命名一种类型。因此MyAllocList<T>是一种独立类型,typename既不需要又不允许。

当编译器遇到使用MyAllocList&lt;T>::type的时候,它不能确定这是一种类型,因为可能存在一种MyAllocList的特化(specialization),MyAllocList<T>::type不表示为类型,例如:

class Wine{};template<>class MyAllocList
{ enum class WineType{ White, Red, Rose }; WineType type; // type is a data member}

高级

在进行模板元编程(TMP)的时候,往往需要类型转换。C++11<type_traits>头文件中一共了一些方法,把类型T转换为std::transformation<T>::type类型。

// C++11, use typedefstd::remove_const
::type // const T -> Tstd::remove_reference
::type // T&(T&&) -> Tstd::add_lvalue_reference
::type // T -> T&// C++14, use alias declarationstd::remove_const_t
std::remove_reference_t
std::add_lvalue_reference_t

总结

  • typedef不支持模板化,但是别名声明支持

  • 别名模板避免了“::type”后缀,并且在模板中,使用typedef是需要的前缀“typename”可以舍去

  • C++14为C++11的类型转换特性提供了别名模板

转载地址:http://gefzo.baihongyu.com/

你可能感兴趣的文章
css知多少(9)——float下篇(转)
查看>>
JavaScript中科学计数法转化为数值字符串形式
查看>>
thrift语法
查看>>
杀死进程
查看>>
Kafka之生产者消费者示例
查看>>
CMS:文章管理之模型和Store
查看>>
【FTP】java FTPClient 文件上传内容为空,文件大小为0
查看>>
新项目经理必读:分析什么是项目经理
查看>>
微信“摇一摇&#183;周边”正式开放
查看>>
java jdbc与odbc数据库的连接mysql数据库
查看>>
jQuery(3)
查看>>
android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序
查看>>
第六章例题、心得及问题。
查看>>
iphone xcode 错误提示 Xcode encountered an internal logic error.
查看>>
lsyncd —— 多机器实时同步文件神器
查看>>
Python 文件操作
查看>>
SpringCloud学习成长之路二 服务客户端(rest+ribbon)
查看>>
CDH5.5.6下R、RHive、RJava、RHadoop安装测试
查看>>
57、唤醒正在睡眠的线程
查看>>
文字输出
查看>>