【问题标题】:c++ auto for type and nontype templatesc++ auto 用于类型和非类型模板
【发布时间】:2019-05-01 18:39:34
【问题描述】:

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

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

【问题讨论】:

    标签: c++ templates language-lawyer c++20


    【解决方案1】:

    是否有计划在下一个 c++20 版本中进行此类扩展?

    没有。

    在使用template<auto... X> 之类的语法以及X 任何类型或非类型模板参数时是否存在一些基本问题?

    这在语言中将是一个全新的概念——在同一个地方有一个名称来指代或者一个类型或者一个值。所以它会附带各种额外的问题 - 可能还有额外的语言功能来检查 X 是否是一种类型。

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

    但肯定有这样的东西有用的地方。提案只需要解决这些问题。

    【讨论】:

    • 我们可以完全删除 template 关键字并用 auto 替换,因为无论如何 autos 在后端都被翻译为模板
    • 我希望你现在提出这个建议
    • @SombreroChicken 不要屏住呼吸。
    • 我现在死了。
    • @texasbruce:正确的语法是auto <auto> auto { auto };。然而,我相信,我们应该通过使用:car <car> car { car }; 来减少 C++ 的冗长。不会有人想到键盘吗?
    【解决方案2】:

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

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

    这可能意味着调用一个以IDENTIFIER 命名的函数而不带参数。这可能意味着默认初始化由IDENTIFIER 命名的类的纯右值。这些是相当不同的事情。您可能在概念上认为它们相似,但 C++ 的语法却不相似。

    模板不是宏;他们没有进行令牌粘贴。有一些理解是,模板中的一段代码应该表示特定的东西。只有至少知道模板参数是什么类型的东西,才能做到这一点。

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

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

    【讨论】:

      【解决方案3】:

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

      唯一的方法是一个很大的“if constexpr”,这在我看来毫无意义。

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

      我记得有人告诉我,重载和模板将使世界摆脱由宏生成的深不可测的错误消息。我还没看到呢!

      【讨论】:

      • 我不得不承认我想不出一个完整的用例。但考虑到存在类型或值都有效的上下文(想到sizeof),我可以想象某个地方的某个人会在某个时候喜欢这个功能。
      • @PasserBy 嗯,但是问“这是专门针对那个的”这个问题,肯定可以由已经知道的编译器更简单地回答吗?
      猜你喜欢
      • 1970-01-01
      • 2022-01-11
      • 2017-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多