05 September 2023

C++ 核心指南目录

“Use tag classes or traits to differentiate concepts that differ only in semantics.”

理由

如果两个割爱年语法一样,但是语义不同,会导致混淆不清。除非程序员把他们区分开来。

例子

template<typename I>    // iterator providing random access
// Note: random_access_iterator is defined in <iterator>
concept RA_iter = ...;

template<typename I>    // iterator providing random access to contiguous data
// Note: contiguous_iterator is defined in <iterator>
concept Contiguous_iter =
    RA_iter<I> && is_contiguous_v<I>;  // using is_contiguous trait

程序库的开发程序员必须定义 is_contiguous_v

把标签类封装进概念,可以简化表达式:

template<typename I> concept Contiguous = is_contiguous_v<I>;

template<typename I>
concept Contiguous_iter = RA_iter<I> && Contiguous<I>;

注意

Traits 可以是类或类型 traits 。可以是用户定义的,也可以是标准库里的。尽量使用标准库里的。

强化

  • 编译器会标记混淆使用的等价的概念
  • 标记等价定义的概念