C++ C++;:是";特质;及;“元功能”;同义词?
或者,特质可能是指利用元功能的特定方式吗 如果它们不是同义词,请给我指出一些不是元功能的特征或不是特征的元功能的例子。一段实际工作的代码,可能在STL或Boost库中,比一个虚构的玩具示例更受欢迎 我想看看C++编程领域的专家如何使用这些术语。我不确定是否有权威的定义 提前谢谢C++ C++;:是";特质;及;“元功能”;同义词?,c++,template-meta-programming,C++,Template Meta Programming,或者,特质可能是指利用元功能的特定方式吗 如果它们不是同义词,请给我指出一些不是元功能的特征或不是特征的元功能的例子。一段实际工作的代码,可能在STL或Boost库中,比一个虚构的玩具示例更受欢迎 我想看看C++编程领域的专家如何使用这些术语。我不确定是否有权威的定义 提前谢谢 澄清:我不是在寻找任何特征或元功能的例子。在我的日常工作中,我已经使用了几十种(如果不是几百种的话) “”。通过公共域获得许可。这些条款并不等同 元函数 该术语在C++标准中没有定义。< /P> 似乎有两个主要的有争议
澄清:我不是在寻找任何特征或元功能的例子。在我的日常工作中,我已经使用了几十种(如果不是几百种的话)
“”。通过公共域获得许可。这些条款并不等同 元函数
该术语在C++标准中没有定义。< /P> 似乎有两个主要的有争议的定义:
1) “元函数在编译时派生/计算/映射到值或类型(基于其参数)”,和/或
功能可能包括也可能不包括在任何给定人员的定义/概念中;函数之间存在重叠,但许多现有的提到元函数的文章都早于或根本没有讨论constexpr
函数,因此很难知道给出的任何定义或示例是否有意为它们留出空间或排除它们constepr
- 元编程的最终产品不一定是编译时类型或常量,它可能是用于运行时值或数据的函数
特点 < C++标准没有定义“特征”,但定义了“特征类”ES: 17.3.25[定义特征]特征类别 一个类,它封装了类模板和函数模板所需的一组类型和函数,以操作它们被实例化的类型的对象 [注:第21、22和27条中定义的Traits类是字符Traits,提供字符串和iostream类所需的字符处理支持。-结束注] 我想补充一点,traits可以有值,也可以有类型和函数——例如exposes
::value
。trait提供类型/值,提供对参数类型本身的洞察,或者当系统处理该类型的变量时,使用trait的系统所期望的行为
标准库的字符特征包含运行时功能的示例:例如X::length(p)
,X::find(p,n,c)
C++标准库中的头是一个很好的地方,可以得到什么样的特性可以用。 trait通常是(但现在C++11不一定提供
constexpr
函数)类,与meta函数或其他函数不同
特性可能会告诉您参数T
是否为常量,是否可序列化,或者在通过TCP传输时是否应进行压缩:任何其他通用代码可能需要为其处理的类型范围自定义其行为
有时,特征将由使用它们的系统提供,而有时,它们可以由希望根据每种类型定制其行为的客户机代码提供
Traits可以通过对参数类型的各种测试来推断事物,也可以是手工制作的专门化,对特定类型的值进行硬编码
这篇关于traits]()的ACCU简介值得一读,其中包括C++创建者的这句话:
将一个特征想象为一个小对象,其主要目的是携带另一个对象或算法用于确定“策略”或“实现细节”的信息比亚恩·斯特罗斯图普
对比“元功能”与“特征”
无论您采用哪种元函数定义,标准都与实现细节有关:何时可以评估函数,和/或是否涉及代码生成/转换。这与traits形成对比,traits的关键概念/需求是它们的目的,而不是使用模板专业化或实例化的通用实现,也不是编译时与运行时评估的任何能力。元函数(在C++环境中)是一个生成可在编译时使用的结果的函数。结果可以是类型(只能在编译时通过定义获得,使用部分专业化等技术)或值(可以在编译时计算,使用模板参数可以是整数值,而不仅仅是类型)
trait本质上是一个类(或对象),它打包信息(策略约束、类型特征、实现细节),以供另一个类(或对象)在编译时使用。打包的信息可以由类型信息(例如typedef
s)或感兴趣的属性组成。例如,std::numeric_limits
(可通过
获得)是一种“类型特征”,它提供有关算术类型的信息(例如T
是否为整数类型?aT
是否可以表示有界或有限的值集?isT
是否有符号等)。信息以某种形式打包,以便metap
using new_type = std::common_type<int, char>::type;
bool ic = std::is_convertible<char, int>::type;
bool ic = std::experimental::is_convertible_v<char, int>;