c++ - 什么是元编程?

标签 c++ qt metaprogramming

引用 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;

}

一个非常简单的例子,但至少这些类型具有某种现实世界的相关性。这个函数生成一个正确大小的数组,它在编译时这样做,并且具有完全的类型安全性。它正在计算我们无法通过硬编码值(我们可能想要连接许多不同大小的数组)或在运行时(因为那样我们会丢失类型信息)来轻松完成的事情

不过,更常见的是,您倾向于对类型而不是值使用元编程。

可以在标准库中找到一个很好的例子。每个容器类型都定义了自己的迭代器类型,但是普通的旧指针可以用作迭代器。 从技术上讲,需要一个迭代器来公开许多 typedef 成员,例如 value_type ,而指针显然不会那样做。所以我们用一点元编程来表达“哦,但是如果迭代器类型是指针,它的 value_type 应该使用这个定义。”

对此有两点需要注意。首先是我们在操作类型,而不是值我们不是说“N 的阶乘是某某”,而是“类型 T 的 value_type 被定义为……”

第二件事是它用于促进泛型编程。 (如果迭代器不适用于所有最简单的示例,即指向数组的指针,则迭代器将不是一个非常通用的概念。因此,我们使用一些元编程来填写将指针视为有效指针所需的详细信息迭代器)。

这是元编程的一个相当常见的用例。当然,您可以将它用于广泛的其他用途(表达式模板是另一个常用示例,旨在优化昂贵的计算,而 Boost.Spirit 是一个完全过火并允许您在编译时定义自己的解析器的示例-时间),但最常见的用途可能是平滑这些小颠簸和极端情况,否则这些情况需要特殊处理并使通用编程变得不可能。

关于c++ - 什么是元编程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/980492/

相关文章:

c++ - 无法在 Qt 4 的 eventFilter 中检测到多个按键

python - 如何将标签置于 QWizardPage 的中心?

groovy - 在 Groovy 的 NodeChild 上添加动态方法的奇怪行为

c++ - 模板元编程列表

c++ - QT绘图不删除widget

c++ - OpenGL GLFW 简单立方体不渲染

c++ - QDockWidgets 合并不正确

ruby - 临时修改(核心)Ruby 模块的库

Python - 如果函数是一等对象,函数可以有方法吗?

c++ - 在运行时组装自己的对象