首页 > 解决方案 > 如何在声明时静态检查我的模板类?

问题描述

在 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默认可构造,但是requiresT.

我可以让编译器检查我的一组requires约束是否足以涵盖类实现所做的一切?

我为此使用 gcc (GCC) 10.0.0 20191207 (experimental)。

标签: c++templatesc++20c++-conceptsdefinition-checking

解决方案


我想要的是定义检查,显然目前不可能

众所周知,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


推荐阅读