何时会检查执行的类型参数

When is type checking for type argument performed?

本文关键字:类型参数 执行 检查 何时会      更新时间:2023-10-16

这是Scott

的一些C 模板代码。
template<typename T>
class chooser {
    public:
    virtual bool operator()(const T& a, const T& b) = 0;
};
template<typename T, typename C>
class arbiter {
    T* best_so_far;
    C comp;
public:
    arbiter() { best_so_far = nullptr; }
    void consider(T* t) {
        if (!best_so_far || comp(*t, *best_so_far)) best_so_far = t;
    }
    T* best() {
        return best_so_far;
    }
};
class case_sensitive : chooser<string> {
public:
    bool operator()(const string& a, const string& b) { return a < b; }
};
...
arbiter<string, case_sensitive> cs_names; // declare new arbiter
cs_names.consider(new string("Apple"));
cs_names.consider(new string("aardvark"));
cout << *cs_names.best() << "n"; // prints "Apple"

C 编译器将创建arbiter的新实例 每次我们声明一个对象(例如,cs_names)的模板 不同的一组通用参数。仅当我们尝试使用这种情况时 一个对象(例如,通过调用consider)会检查是否查看是否是 参数支持所有必需的操作。

因为类型检查被延迟到使用点,没有魔术 关于chooser类。如果我们忽略了定义它,然后将其排除在外 case_sensitive的标题,代码将 仍然编译并仅运行。

是编译时间或运行时间的以下两个时间点:

  • 时间"当我们尝试使用这种对象时"和

  • "使用点"?

"类型检查被延迟直到使用点"表示在运行时进行类型检查?

谢谢。

  • 时间"当我们尝试使用这种对象时"和
  • "使用点"?

两者都指源代码,而不是运行时。

在此行中:

arbiter<string, case_sensitive> cs_names;

编译器看到std::stringcase_sensitive,并试图用CC_1替换为std::stringarbiter版本,而C替换为case_sensitive

如果您使用其他类型定义了另一种arbiter,则将生成并编译新版本的arbiter

alain具有其权利。

对于将来的参考C ,通常会编译时间检查所有内容。我知道的唯一例外是多态类型的动态铸造和函数TypeID,它返回对象的类型。

我认为,如果您使用这些功能,通常应该重新考虑O-O设计。(或者您正在尝试修复他人的破碎代码而不重构)。