一组相关类型的类型特征的设计注意事项

问题描述 投票:0回答:1

C++ 标准库提供

std::char_traits<T>
来统一处理字符数据,而不考虑使用的具体字符类型。

它还提供

<type_traits>
用于更通用的元编程。

这两种特征系统有不同的设计:

std::char_traits<T>
是一个类模板(有几个专业化),有几个静态方法。
<type_traits>
提供独立模板而不是静态方法。

为什么这两个系统采取不同的方法?

我不是在寻求意见。 我希望找出设计特质系统时应考虑的约束。

  • 是否存在某种方法可以做到而另一种方法无法做到的事情?
  • 语言是否已经发展到更适合一种方法或另一种方法? (
    <type_traits>
    在 C++11 中标准化;
    std::char_traits<T>
    较旧)
  • 不同的方法是否反映了问题空间的差异? (通用元编程与特定有限类型集的统一处理)

我目前正在为特定领域设计第二个版本的特征集合。 在选择具有静态方法的类模板还是独立模板集合时,我意识到我不知道应该考虑哪些因素。

c++ template-meta-programming type-traits char-traits
1个回答
0
投票

为什么这两个系统采取不同的方法?

对于自由函数与方法函数、多个参数与类,耦合是不同的。

这会带来几个优点/缺点:

  • 因此需要传递这些信息的类必须在
  • 之间进行选择
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*>
) 然而,如果你将它们分组,你必须要么拥有那些私人助手特征来分组,要么专门针对每种类型来考虑整个类。

  • 链接到先例的是允许用户自定义的类型。

需要专门化整个类型,而不仅仅是相关的特征。

是否存在某种方法可以做到而另一种方法无法做到的事情?

我什么也没看到。

语言是否已经发展到更适合一种方法或另一种方法? (

<type_traits>
在 C++11 中标准化;
std::char_traits<T>
更旧) 不同的方法是否反映了问题空间的差异? (通用元编程与特定有限类型集的统一处理)

大多数 type_traits 在 C++11 之前就可以实现(不能实现的大部分是需要编译器帮助的,并且不是来自上面的选择),在 C++11 中没有任何变化。

C++20 允许部分专业化,这要归功于概念,但适用于两种形式。

© www.soinside.com 2019 - 2024. All rights reserved.