除了集合之外,模板还可以用于什么
What can templates be used for other than collections
我正在学习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++宏通常只能用于在编译时创建类型或函数。
相关文章:
- 我还可以添加什么来按空格或空格正确拆分C++字符串?
- std::list 可以用于简单的无锁队列吗?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 有没有类似于stoi的函数可以用于模板类
- gcc 中的多个对齐属性是否可以用于保证缓存行分隔?
- 指针可以用于访问内存中的任何任意区域吗?
- 本地分配的内存是否可以用于将来使用?
- Android Studio 3 C 文件中充满了错误,但汇编还可以
- 首先我已经成功安装了 caffe,但是当我运行一个 caffe 项目时,cmake 还可以,后来会发出很多错误
- 浮点计算可以用于任何可靠的函数,特别是容器和算法吗?
- 除了集合之外,模板还可以用于什么
- 为什么从 std::mem_fn 返回的可调用对象可以用于对象和shared_ptrs
- DAWG可以用于存储与单词相关的信息吗?
- 泛型函数是否可以用于对结构求和
- 谷歌性能工具可以用于分析C应用程序吗?
- 可以用于获取参数类型的 decltype
- 哪个虚拟指针值还可以
- Google Play游戏服务可以用于PC游戏吗?(Windows/Linux/OSX)
- C++模板可以用于条件代码包含吗
- 视觉 除了垃圾回收之外,"new_handler"还可以用于C++什么?