为什么C++11没有模板typedef?

2023-11-29

为什么 C++11 没有“模板类型定义”,例如

template<typename T> typedef std::vector<T, myalloc<T>> vec;

相反,它们只允许新语法:

template<typename T> using vec = std::vector<T, myalloc<T>>;

n1406是 Herb Sutter 对“typedef 模板”的提议,它模仿了您问题中的语法。n1499它建议“模板别名”取代它,其中包含usingC++11 中当前存在的语法。

这两篇论文都解决了“typedef 模板”的主要缺点之一。从 n1406 开始:

在现有实践中,包括在标准库中,类型名称 嵌套在辅助类模板中用于解决此问题 很多情况下都会出现问题。以下是这种常见情况的一个示例 解决方法;主要缺点是使用时需要写::Type typedef 的名称。

template< typename T >
struct SharedPtr
{
  typedef Loki::SmartPtr
    <
      T,                // note, T still varies
      RefCounted,       // but everything else is fixed
      NoChecking,
      false,
      PointsToOneObject,
      SingleThreaded,
      SimplePointer<T>  // note, T can be used as here
    >
  Type;
};

SharedPtr<int>::Type p; // sample usage, “::Type” is ugly

我们真正想要做的就是这样:

template< typename T >
typedef Loki::SmartPtr
  <
    T,                // note, T still varies
    RefCounted,       // but everything else is fixed
    NoChecking,
    false,
    PointsToOneObject,
    SingleThreaded,
    SimplePointer<T>  // note, T can be used as here
  >
  SharedPtr;

SharedPtr<int> p;     // sample usage, “::Type” is ugly

[...]

解决方法很难看,最好将其替换为 一流的语言支持,为用户提供自然的 C++ 模板 句法。

这种“一流的语言支持”以模板别名的形式出现。我们现在可以看看 n1499 所说的:

在本文中,我们将重点描述一种别名机制,该机制 允许 N1406 中提到的两种语义共存,而不是 被视为相互排斥。首先让我们考虑一个玩具示例:

template <typename T>
class MyAlloc {/*...*/};

template <typename T, class A>
class MyVector {/*...*/};

template <typename T>
struct Vec {
typedef MyVector<T, MyAlloc<T> > type;
};

Vec<int>::type p; // sample usage

这个习语的根本问题和主要动机 对于这个建议,习惯用法会导致模板参数 出现在不可演绎的上下文中。也就是说,将不可能 调用函数foo下面没有明确指定模板 论据。

template <typename T> void foo (Vec<T>::type&);

另外,语法有点难看。我们宁愿避免嵌套 ::键入呼叫。我们更喜欢像下面这样的东西:

template <typename T>
using Vec = MyVector<T, MyAlloc<T> >; //defined in section 2 below

Vec<int> p;      // sample usage

请注意,我们特别避免使用术语“typedef template”并且 引入涉及“using”和“=”对的新语法来提供帮助 避免混淆:我们不是defining这里的任何类型,我们都是 为抽象引入同义词(即别名)type-id(即类型表达式)涉及模板参数。如果模板 参数在类型表达式的可推论上下文中使用,然后 每当模板别名用于形成模板 ID, 这 可以推导出相应模板参数的值 – 更多 接下来将对此进行介绍。无论如何,现在可以编写通用的 运行的函数Vec<T>在可推论的背景下,并且 语法也得到了改进。例如我们可以重写foo as:

template <typename T> void foo (Vec<T>&);

我们在此强调,提出这一建议的主要原因之一是 模板别名是为了参数推导和调用foo(p)将会成功。

因此,您可以看到 n1499 解决了 n1406 中的问题,并引入了更清晰、更易于阅读的语法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么C++11没有模板typedef? 的相关文章

随机推荐

  • 如何设置数字样式?

    我正在尝试改变数字的样式 我想在每 3 位数字之间添加一些空格 我会确切地知道这些数字在 html 中的位置 当我从 html 检索号码时 它需要与我输入的号码完全相同 所以我只想设计数字的样式 不修改号码 我可以使用 javascript
  • 当 python 列表迭代是或不是引用时

    有人可以对这两个Python操作在修改列表方面的区别提供一个简洁的解释吗 demo a b c for d in demo d print demo output a b c for c in range len demo demo c p
  • 抑制函数的命令窗口输出

    我正在使用的一个功能有display 在其中 或在命令窗口上显示消息的其他内容 因此当我运行代码时 它会在命令行上输出很多内容 x 1200 这使得事情很难跟踪和观察 有没有办法抑制这个特定函数的输出 用分号结束语句显然没有帮助 您可以尝试
  • 如何纠正 fortify 给出的路径操作错误?

    我需要读取保存在 user home 文件夹中的属性文件 PropsFile System getProperty user home System getProperty file separator x properties Forti
  • 构建 INSERT 语句值的动态列表

    我正在编写一个存储过程来创建一组DELETE管理员针对数据库运行的语句 作为 回滚 解决方案的一部分 我希望对于要删除的每一行 还分别创建一个相应的INSERT语句 以便运行脚本的人希望撤消 他们可以简单地对数据库运行插入语句 我的问题是
  • 使用 JSON 和 AFNetworking NSDictionary 用数据填充表视图

    c ios n00b 在这里 我已经研究这个问题三天了 我担心我缺少一个基本概念 我已经研究并完成了与此相关的每个教程和堆栈溢出问题 但我无法得到答案 我正在尝试使用 json 文件中的数据填充我的 tableviewcontroller
  • poi读取现有的excel并用大数据进行编辑

    我使用 apache poi 来读取和写入 excel 我可以毫无问题地做到这一点 但是在现有 excel 上写入大型 excel 时 我面临内存问题 下面更详细地解释 我有一个模板 其中列标题是彩色的 有些是合并的 我说的是一张纸中的 1
  • 在地址“0xXXXXXX”处中断,没有可用的调试信息,或在程序代码之外

    配置 使用 Nucleo L476RG 使用 GNU ARM Eclipse 我从 STM32CubeMX 生成了一个极简代码 我已经在我的板载 ST Link 中刷新了 J link 驱动程序 一直在尝试为我的代码运行调试器 但我的程序计
  • Android Studio - 创建模块而不复制文件?

    我正在 Android Studio 中创建具有依赖项的项目 我知道如何通过添加模块来链接项目 但我意识到 导入模块 会在项目内创建 libProject 的副本 有办法防止这种情况吗 就像 外部模块 由于我负责这两个项目 因此我希望能够将
  • Ajax 联系表单问题 - 未发送电子邮件

    抱歉我是个菜鸟 但我正在尽力 我已经完成并阅读了我能找到的所有内容 但我从未让它发挥作用 非常感谢您的帮助 表单 ID 在 html 和 javascript 中匹配 PHP 链接在 Javascript 中 我将 javascript 链
  • 选择GUI时如何去除黑色边框?

    我正在尝试添加一个Entry小部件到Frame with a Scrollbar 当我点击 GUI 时 会出现黑色边框 import Tkinter as tk class Example tk Frame def init self ro
  • 如何在基于servlet的项目中获取部署根目录?

    我正在尝试从 java 获取基于 servlet 的项目的部署根目录 我正在使用以下代码行来获取路径详细信息 Type 1 File directory new File try System out println Current dir
  • 在 iPhone 中保留计数

    我用过 anArray retainCount 获取数组的保留计数 我知道这不应该使用 但我只是为了学习保留概念而使用 以下是我的代码 NSString str NSString alloc initWithFormat a b c d N
  • 两个函数的 JavaScript 回调

    有没有办法用Javascript ES6 实现下面的代码 如果是 我该怎么做 我尝试了这个例子 但没有成功 const funcA callback arg1 gt console log Print arg1 arg1 Print arg
  • GMail 上下文小工具无法正常工作

    我正在尝试在我的域中部署上下文小工具 我已遵循开发指南 但该小工具未显示 我认为问题在于 数据访问 如果安装似乎顺利 则发生事件 在 Google Apps 控制台中 小工具的数据访问部分显示一个红色 X 如果我尝试通过按特定链接授予访问权
  • 我可以更改之前创建的 matplotlib FuncAnimation 的间隔吗?

    我试图弄清楚是否有任何方法可以更改现有 matplotlib FuncAnimation 的间隔 我希望能够根据用户输入调整动画的速度 我发现了类似的问题如何更改帧之间的间隔 python 但既然没有得到答案 我想我还是会问它 我需要和拥有
  • 如果字符串以“1”开头,则替换标签之间的字符串

    我有一个巨大的 XML 文件 大约 100MB 每一行都包含以下内容
  • 允许延期交货并通知客户有关 Woocommerce 中的特定产品类别

    在 woocommerce 中 我正在尝试添加一些代码functions php允许特定产品类别的缺货 但代码不起作用 如何在 Woocommerce 中允许延期交货并通知客户特定产品类别 Updated 尝试以下操作 您将在数组中为每个函
  • 使用任何东西在 Objective-C 中加密/在 Ruby 中解密

    我们使用此代码在 iPhone 上的 Objective C 中进行加密 NSMutableData EncryptAES NSString key char keyPtr kCCKeySizeAES128 1 bzero keyPtr s
  • 为什么C++11没有模板typedef?

    为什么 C 11 没有 模板类型定义 例如 template