C++ 自动用于类型和非类型模板
c++ auto for type and nontype templates
在 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++中创建这样的功能,您需要:
- 创建一个新语法来声明 omni 模板参数(
auto
不会飞行,因为它已经具有特定的含义)。 - 提供用于确定全模板参数的语法。
- 要求用户先调用该语法,然后才能以大多数方式使用此类参数名称。这通常是通过某种形式的专用
if constexpr
块,但模式匹配建议代表了一种有趣的替代/附加方法来处理它们(因为它们可以是表达式和语句)。扩展语句表示访问参数包中所有 omni 参数的可能方法。
我看不出模板参数可以动态地成为类型或值有什么用?使用类型的代码语句与使用通过模板参数引入的常量值的代码语句非常不同。
唯一的办法就是一个大的"如果 constexpr",在我看来,这将使它毫无意义。
好的,在更仔细地研究了引用的问题之后,我想那里有空间来通用地传递包装使用不同参数排序的各种显式基本模板实现。我仍然没有看到巨大的好处。如果不出意外,编译器出错时的错误将是深不可测的!
我记得有人告诉我,重载和模板将消除宏生成的深不可测的错误消息。我还没有看到它!
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- 是否可以从int转换为enum类类型
- 构造函数正在调用一个使用当前类类型的函数
- 我应该使用什么来代替void作为变体中的替代类型之一
- 类中的字符串不命名类型