c++ - 如何在声明时静态检查我的模板类?
问题描述
在 C# 或 Java 中,以下内容无法编译,因为我“忘记了”where
类声明中指定 T 是定义add
方法的实例的部分。
class C<T> {
T make(T t) {
return t.add(t);
}
}
requires
如果我为模板参数指定不完整,我想在 C++ 中进行类似的编译时检查。
template <typename T>
requires true
class C {
public:
T make() {
return T{};
}
};
我想为上面的 C++ 代码获取一个编译错误,说明该方法c.make
依赖于T
默认可构造,但是requires
在T
.
我可以让编译器检查我的一组requires
约束是否足以涵盖类实现所做的一切?
我为此使用 gcc (GCC) 10.0.0 20191207 (experimental)。
解决方案
我想要的是定义检查,显然目前不可能
众所周知,C++2a 概念(以前称为“Concepts Lite”和/或概念 TS)不支持“定义检查”。定义检查的想法是程序员可能会编写 [...]
https://quuxplusone.github.io/blog/2019/07/22/definition-checking-with-if-constexpr/
8.2 定义检查
概念目前不阻止模板使用需求中未指定的操作。考虑:
template<Number N>
void algo(vector<N>& v){
for (auto& x : v) x%=2;
}
我们的 Number 概念不需要 %=,所以调用 algo 是否成功不仅取决于概念检查的内容,还取决于参数类型的实际属性:参数类型是否有 %=?如果没有,我们会得到一个迟到的(实例化时间)错误。
有些人认为这是一个严重的错误。我不 [...]
http://www.w.stroustrup.com/good_concepts.pdf
当前的提案检查接口,这是对用户的主要好处,但不是模板定义。这从一开始就很明确。
https://isocpp.org/blog/2016/02/a-bit-of-background-for-concepts-and-cpp17-bjarne-stroustrup
推荐阅读
- php - 安装时出现 Wordpress http 500 错误
- r - data.table 在每一列上应用函数
- asp.net-mvc - 接受来自 MVC 控制器的 websocket 升级
- bash - 使用外部实用程序 (plink) 运行 shell 脚本 - 无法提供上下文
- django - 如何在 django urlpatterns 中使用查询字符串重定向?
- node.js - model.find() 在函数中返回空,而在函数外正常工作?
- c# - 如何检查文件哈希是否已使用 C# 更改
- angularjs - 使用角度 5 解析的 css calc() 遇到问题
- linux - 为什么aria2c Linux版比Windows版大很多
- toast - Nuxt.js - 无法解析“@nuxtjs/toast”