10 September 2023

C++ 核心指南目录

“Use template aliases to simplify notation and hide implementation details”

理由

提升可读性。隐藏实现细节。模板别名可以替代很多 traits 和类型计算的应用。也可以用来封装一个 traits

例子

template<typename T, size_t N>
class Matrix {
    // ...
    using Iterator = typename std::vector<T>::iterator;
    // ...
};

这样写, Matrix 的用户不用关心元素是不是存在一个 vector 中。用户也可以避免重复输入 typename std::vector<T>::

例子

template<typename T>
void user(T& c)
{
    // ...
    typename container_traits<T>::value_type x; // bad, verbose
    // ...
}

template<typename T>
using Value_type = typename container_traits<T>::value_type;

这样写,用户就不需要知道实现 value_type 的技术细节。

template<typename T>
void user2(T& c)
{
    // ...
    Value_type<T> x;
    // ...
}

注意

一个简单的,常用的情况,可以通过 traits 封装实现。

强化

  • 标记在 using 之外使用 typename 来进行说明的情况。