std::char_traits<T>
来统一处理字符数据,而不考虑使用的具体字符类型。
<type_traits>
用于更通用的元编程。
这两种特征系统有不同的设计:
std::char_traits<T>
是一个类模板(有几个专业化),有几个静态方法。 <type_traits>
提供独立模板而不是静态方法。
为什么这两个系统采取不同的方法?
我不是在寻求意见。 我希望找出设计特质系统时应考虑的约束。
<type_traits>
在 C++11 中标准化;std::char_traits<T>
较旧)我目前正在为特定领域设计第二个版本的特征集合。 在选择具有静态方法的类模板还是独立模板集合时,我意识到我不知道应该考虑哪些因素。
为什么这两个系统采取不同的方法?
对于自由函数与方法函数、多个参数与类,耦合是不同的。
这会带来几个优点/缺点:
template <typename T, typename AllTrait = MyTrait<T>>
struct MyClass;
或
template <typename T, typename Trait1 = MyTrait1<T>, typename Trait2 = MyTrait2<T>, ...>
struct MyClass;
个体特征允许简单的实施(
is_pointer<T*>
)
然而,如果你将它们分组,你必须要么拥有那些私人助手特征来分组,要么专门针对每种类型来考虑整个类。
需要专门化整个类型,而不仅仅是相关的特征。
是否存在某种方法可以做到而另一种方法无法做到的事情?
我什么也没看到。
语言是否已经发展到更适合一种方法或另一种方法? (
在 C++11 中标准化;<type_traits>
更旧) 不同的方法是否反映了问题空间的差异? (通用元编程与特定有限类型集的统一处理)std::char_traits<T>
大多数 type_traits 在 C++11 之前就可以实现(不能实现的大部分是需要编译器帮助的,并且不是来自上面的选择),在 C++11 中没有任何变化。
C++20 允许部分专业化,这要归功于概念,但适用于两种形式。