用于类型和非类型模板的 c++ auto
c++ auto for type and nontype templates
在 c++17 中 template <auto>
允许声明具有任意类型参数的模板。部分受到 问题的启发,扩展 template <auto>
可以捕获类型和非类型模板参数,并且还允许它的可变版本。
是否计划在下一个 c++20 版本中进行此类扩展?使用 template<auto... X>
和 X
任何类型或非类型模板参数的语法是否存在一些基本问题?
Are there plans for such an extension in the next c++20 release?
没有
Is there some fundamental problem in having a syntax like template<auto... X>
, with X
any type or nontype template parameter?
这将是语言中的一个全新概念 - 有一个名称指的是 类型 或 相同的值地方。所以它会带来各种额外的问题——可能还有额外的语言特性来检查 X
是否是一种类型。
语法可能不能是template <auto... X> struct Y { };
,因为该语法已经有意义并且意味着一堆值并且Y<int>{}
格式错误。
虽然这样的东西肯定会有用的地方。提案只需要解决这些问题。
我看不出模板参数可以动态地是类型或值有什么用?使用类型的代码语句与使用通过模板参数引入的常量值的代码语句非常不同。
唯一的办法是大 "if constexpr",这在我看来毫无意义。
好的,在更仔细地研究了所引用的问题之后,我想这里有空间用于一般传递包装使用不同参数顺序的各种显式基本模板实现。我仍然看不到巨大的好处。编译器出问题时的错误将是深不可测的,如果不出意外!
我记得有人告诉我,重载和模板将使世界摆脱宏生成的深不可测的错误消息。我还没有看到它!
尝试这样做的最大问题是语法。模板参数预先说明它们是模板、类型还是值,最重要的原因是语法。
C++ 是一种上下文相关的语法。这意味着您无法仅从一系列标记中知道特定标记序列的含义。例如,IDENTIFIER LEFT_PAREN RIGHT_PAREN SEMICOLON
。这是什么意思?
这可能意味着不带参数调用由IDENTIFIER
命名的函数。它可能意味着默认初始化由 IDENTIFIER
命名的 class 的纯右值。这些是完全不同的东西;您可能在概念上认为它们相似,但 C++ 的语法并不相似。
模板不是宏;他们没有做令牌粘贴。有一些理解认为模板中的一段代码应该表示特定的事物。而且只有当您至少知道模板参数是什么东西时,您才能这样做。
为了保留此能力,这些 "omni template parameters" 在您真正了解它们的含义之前不能使用。因此,为了在 C++ 中创建这样的功能,您需要:
- 创建一个新的语法来声明 omni 模板参数(
auto
不会飞,因为它已经具有特定的含义)。
- 提供一种语法来确定全向模板参数的类型。
- 要求用户在以大多数方式使用此类参数名称之前调用该语法。这通常是通过某种形式的专门
if constexpr
块,但模式匹配提议代表了一种有趣的 alternative/additional 处理它们的方式(因为它们可以是表达式也可以是语句)。扩展语句代表了一种访问参数包中所有全向参数的可能方式。
在 c++17 中 template <auto>
允许声明具有任意类型参数的模板。部分受到 template <auto>
可以捕获类型和非类型模板参数,并且还允许它的可变版本。
是否计划在下一个 c++20 版本中进行此类扩展?使用 template<auto... X>
和 X
任何类型或非类型模板参数的语法是否存在一些基本问题?
Are there plans for such an extension in the next c++20 release?
没有
Is there some fundamental problem in having a syntax like
template<auto... X>
, withX
any type or nontype template parameter?
这将是语言中的一个全新概念 - 有一个名称指的是 类型 或 相同的值地方。所以它会带来各种额外的问题——可能还有额外的语言特性来检查 X
是否是一种类型。
语法可能不能是template <auto... X> struct Y { };
,因为该语法已经有意义并且意味着一堆值并且Y<int>{}
格式错误。
虽然这样的东西肯定会有用的地方。提案只需要解决这些问题。
我看不出模板参数可以动态地是类型或值有什么用?使用类型的代码语句与使用通过模板参数引入的常量值的代码语句非常不同。
唯一的办法是大 "if constexpr",这在我看来毫无意义。
好的,在更仔细地研究了所引用的问题之后,我想这里有空间用于一般传递包装使用不同参数顺序的各种显式基本模板实现。我仍然看不到巨大的好处。编译器出问题时的错误将是深不可测的,如果不出意外!
我记得有人告诉我,重载和模板将使世界摆脱宏生成的深不可测的错误消息。我还没有看到它!
尝试这样做的最大问题是语法。模板参数预先说明它们是模板、类型还是值,最重要的原因是语法。
C++ 是一种上下文相关的语法。这意味着您无法仅从一系列标记中知道特定标记序列的含义。例如,IDENTIFIER LEFT_PAREN RIGHT_PAREN SEMICOLON
。这是什么意思?
这可能意味着不带参数调用由IDENTIFIER
命名的函数。它可能意味着默认初始化由 IDENTIFIER
命名的 class 的纯右值。这些是完全不同的东西;您可能在概念上认为它们相似,但 C++ 的语法并不相似。
模板不是宏;他们没有做令牌粘贴。有一些理解认为模板中的一段代码应该表示特定的事物。而且只有当您至少知道模板参数是什么东西时,您才能这样做。
为了保留此能力,这些 "omni template parameters" 在您真正了解它们的含义之前不能使用。因此,为了在 C++ 中创建这样的功能,您需要:
- 创建一个新的语法来声明 omni 模板参数(
auto
不会飞,因为它已经具有特定的含义)。 - 提供一种语法来确定全向模板参数的类型。
- 要求用户在以大多数方式使用此类参数名称之前调用该语法。这通常是通过某种形式的专门
if constexpr
块,但模式匹配提议代表了一种有趣的 alternative/additional 处理它们的方式(因为它们可以是表达式也可以是语句)。扩展语句代表了一种访问参数包中所有全向参数的可能方式。