何时会检查执行的类型参数
When is type checking for type argument performed?
这是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::string
和case_sensitive
,并试图用CC_1替换为std::string
的arbiter
版本,而C
替换为case_sensitive
。
如果您使用其他类型定义了另一种arbiter
,则将生成并编译新版本的arbiter
。
alain具有其权利。
对于将来的参考C ,通常会编译时间检查所有内容。我知道的唯一例外是多态类型的动态铸造和函数TypeID,它返回对象的类型。
我认为,如果您使用这些功能,通常应该重新考虑O-O设计。(或者您正在尝试修复他人的破碎代码而不重构)。
相关文章:
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 如何解决一元"*"(有"字符")错误的无效类型参数?
- "std::shared_ptr":不是参数"_Ty"的有效模板类型参数
- 具有可变参数非类型参数的模板专用化
- 函数类型参数的模板参数推导
- PowerShell 使用结构类型参数调用 C++ DLL 的导出函数
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- 为模板传递非类型参数 agument
- 为什么带有类型参数的运算符 () 可以应用于 result_of 上下文中的类型?
- 使用其他模板类型参数作为要在函数签名中使用的类型别名声明
- 如何避免具有相同类型参数的函数中的错误
- 将内置类型变量传递给只有一个类类型参数的"+"运算符函数时自动类型转换的构造函数
- 如何对模板类型强制执行常量
- c++非类型参数包扩展
- 如何实现对参数顺序不可知的std::same_as的广义形式(即对于两个以上的类型参数)
- 在不同的模板参数包之间分发非类型参数包
- 如何在使用容器和字符串时强制使用显式分配器类型参数
- 错误:一元"*"的类型参数无效(具有"int"):使用 mergesort 计算
- 根据类模板的类型参数自动执行类模板的大小参数
- 何时会检查执行的类型参数