问题描述
关于this question,有人能解释一下并发布元编程的示例代码吗?我在谷歌上搜索了这个词,但我找不到任何例子来说服我,它可以有任何实际用途。
同样,Qt's Meta Object System是元编程的一种形式吗?
JRH
推荐答案
到目前为止,大多数示例都对值进行了操作(计算pi的位数、N的阶乘或类似的值),这些都是教科书上的示例,但通常不是很有用。很难想象有哪种情况真的需要编译器来计算pi的第17位数字。您可以自己硬编码它,也可以在运行时计算它。
一个可能与现实世界更相关的例子可能是:
假设我们有一个数组类,其大小是模板参数(因此这将声明一个由10个整数组成的数组:array<int, 10>
)
现在,我们可能希望连接两个数组,并且可以使用一些元编程来计算结果数组大小。
template <typename T, int lhs_size, int rhs_size>
array<T, lhs_size + rhs_size> concat(const array<T, lhs_size>& lhs, const array<T, rhs_size>& rhs){
array<T, lhs_size + rhs_size> result;
// copy values from lhs and rhs to result
return result;
}
一个非常简单的例子,但至少这些类型与现实世界有某种相关性。此函数在编译时生成大小正确的数组,并且具有完全的类型安全性。它是通过硬编码值(我们可能希望连接许多具有不同大小的数组)或在运行时(因为那样我们会丢失类型信息)来轻松完成的计算。
不过,更常见的情况是,您倾向于对类型而不是值使用元编程。
可以在标准库中找到一个很好的例子。每种容器类型都定义了自己的迭代器类型,但普通老式指针也可以用作迭代器。
从技术上讲,需要使用迭代器来公开一些tyecif成员,例如value_type
,而指针显然不能做到这一点。因此,我们使用一些元编程来说明"哦,但是如果迭代器类型被证明是一个指针,那么它的value_type
应该使用这个定义。"
关于这一点有两点需要注意。第一个问题是我们操作的是类型,而不是值我们不是说"N的阶乘是某某",而是"类型T的value_type
被定义为..."
第二件事是它用于简化泛型编程。(如果迭代器不适用于所有最简单的示例中的一个指向数组的指针,那么它就不是一个非常通用的概念。因此,我们使用一些元编程来填充指针被视为有效迭代器所需的细节)。
这是元编程的一个相当常见的用例。当然,您可以将其用于广泛的其他用途(表达式模板是另一个常用的示例,旨在优化昂贵的计算和Boost.SPIRIT是一个完全过火的示例,允许您在编译时定义自己的解析器),但最常见的用途可能是消除这些小的凹凸不平的情况,否则这些情况将需要特殊处理,并使泛型编程变得不可能。
这篇关于什么是元编程?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!