除了集合之外,模板还可以用于什么

What can templates be used for other than collections

本文关键字:还可以 用于 什么 集合      更新时间:2023-10-16

我正在学习c ++并试图理解模板。

据我收集,模板用于定义对象集合,以防我们不关心它是什么,只要它们都是相同的类型。

另一方面,如果我们需要在提供的对象上执行操作,多态性是更好的选择,因为我们有一个保证方法实现的类型。

这就是它的全部内容吗?或者模板可以用于其他事情吗?就像集合以外的任何东西一样。

这是Stroustrup本人转述的一个例子:

#include <string>
#include <iostream>
#include <utility>
#include <stdexcept>
template<typename Iter>
void osprintf(::std::ostream &os, Iter begin, const Iter &end)
{
bool saw_brace = false;
while (begin != end) {
const char c = *begin;
if (c == '{') {
saw_brace = true;
} else if (saw_brace && c == '}') {
throw ::std::runtime_error("More format specifiers than arguments in osprintf");
} else if (saw_brace) {
os << '{' << c;
saw_brace = false;
} else {
os << c;
}
++begin;
}
if (saw_brace) {
os << '{';
}
}
template<typename Iter, typename T, typename... Args>
void osprintf(::std::ostream &os, Iter begin, const Iter &end, T &&value, Args && ...args)
{
bool saw_brace = false;
while (begin != end) {
const char c = *begin;
if (c == '{') {
saw_brace = true;
} else if (saw_brace && c == '}') {
os << value;
osprintf(os, ++begin, end, ::std::forward<Args>(args)...);
return;
} else if (saw_brace) {
os << '{' << c;
saw_brace = false;
} else {
os << c;
}
++begin;
}
if (saw_brace) {
os << '{';
}
throw ::std::runtime_error("More arguments than format specifiers for osprintf");
}
template<typename T, typename... Args>
void osprintf(::std::ostream &os, const ::std::string &format, T &&value, Args && ...args)
{
osprintf(os, format.begin(), format.end(), ::std::forward<T>(value), ::std::forward<Args>(args)...);
}
int main()
{
osprintf(::std::cout, "This should be a 5: {}, and this should be a 'foobar': '{}'n", 5, "foobar");
return 0;
}

这是 Cprintf的模板化版本,它是类型安全的,并使用 '{}' 作为格式占位符。模板程序(供编译器运行的程序)查看参数列表并构建一个 printf 函数,该函数扫描格式字符串以查找 '{}' 对,并将它们替换为参数列表中的下一个值。如果参数的数量与'{}'对的数量不匹配,则会引发异常。

C++中的模板比 Java 中的模板强大得多。这是Java设计者有目的的决定。他们切断了 Java C++模板的功能,因为这种功能是C++复杂性的重要来源,他们不希望 Java 具有这种复杂性。这个原因与为什么 Java 中没有运算符重载而C++中存在的原因非常相似。

还有无数其他的例子。拥有编译器执行的程序语言来编译程序是非常强大的,并且在C++模板之前,该功能仅在Common Lisp中真正可用。

有非常好的"宏"语言(如m4),但这些语言与它们以相同的方式生成的程序交织在一起,因此根据正在生成的程序语言的细节,对宏应该如何扩展做出正确的决定并不容易。

C++的模板仍然不如Common Lisps宏强大。在Common Lisp中,宏可以用来创建以前不存在的全新控制结构,而C++宏通常只能用于在编译时创建类型或函数。