C++ 自动用于类型和非类型模板

c++ auto for type and nontype templates

本文关键字:类型 C++ 用于      更新时间:2023-10-16

在 c++17 中,template <auto>允许使用任意类型参数声明模板。部分受此问题的启发,具有捕获类型和非类型模板参数的template <auto>扩展将很有用,并且还允许它的可变参数版本。

在下一个 c++20 版本中是否有这样的扩展计划?拥有像template<auto... X>这样的语法是否存在一些基本问题,X任何类型或非类型模板参数?

在下一个 c++20 版本中是否有这样的扩展计划?

不。

拥有像template<auto... X>这样的语法是否存在一些基本问题,X任何类型或非类型模板参数?

在语言中这将是一个全新的概念 - 名称在同一位置引用类型值。因此,它带有各种其他问题 - 可能还有其他语言功能来检查X是否是一种类型。

语法可能无法template <auto... X> struct Y { };因为该语法已经具有含义,并且意味着一堆值,并且Y<int>{}格式不正确。

不过,肯定有一些地方这样的东西会很有用。一项提案只需要解决这些问题。

尝试做这样的事情的最大问题是语法。模板参数预先声明它们是模板、类型还是值,其中最重要的原因是语法。

C++是一种上下文相关的语法。这意味着您无法仅从令牌序列中知道特定令牌序列的含义。例如,IDENTIFIER LEFT_PAREN RIGHT_PAREN SEMICOLON.那是什么意思?

这可能意味着调用一个由IDENTIFIER命名的函数,没有参数。这可能意味着默认初始化由IDENTIFIER命名的类的 prvalue 。这些是相当不同的事情;您可能在概念上将它们视为相似,但C++的语法并非如此。

模板不是宏;它们不执行令牌粘贴。有一些理解是,模板中的一段代码应该意味着特定的东西。只有当你至少知道模板参数是什么东西时,你才能做到这一点。

为了保持这种能力,在您真正了解它们的含义之前,无法使用这些"全模板参数"。因此,为了在C++中创建这样的功能,您需要:

  1. 创建一个新语法来声明 omni 模板参数(auto不会飞行,因为它已经具有特定的含义)。
  2. 提供用于确定全模板参数的语法。
  3. 要求用户先调用该语法,然后才能以大多数方式使用此类参数名称。这通常是通过某种形式的专用if constexpr块,但模式匹配建议代表了一种有趣的替代/附加方法来处理它们(因为它们可以是表达式和语句)。扩展语句表示访问参数包中所有 omni 参数的可能方法。

我看不出模板参数可以动态地成为类型或值有什么用?使用类型的代码语句与使用通过模板参数引入的常量值的代码语句非常不同。

唯一的办法就是一个大的"如果 constexpr",在我看来,这将使它毫无意义。

好的,在更仔细地研究了引用的问题之后,我想那里有空间来通用地传递包装使用不同参数排序的各种显式基本模板实现。我仍然没有看到巨大的好处。如果不出意外,编译器出错时的错误将是深不可测的!

我记得有人告诉我,重载和模板将消除宏生成的深不可测的错误消息。我还没有看到它!