什么是元编程?

What is 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;

}

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

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

可以在标准库中找到一个很好的例子。每种容器类型都定义了自己的迭代器类型,但普通老式指针也可以用作迭代器。 从技术上讲,需要使用迭代器来公开一些tyecif成员,例如value_type,而指针显然不能做到这一点。因此,我们使用一些元编程来说明"哦,但是如果迭代器类型被证明是一个指针,那么它的value_type应该使用这个定义。"

关于这一点有两点需要注意。第一个问题是我们操作的是类型,而不是值我们不是说"N的阶乘是某某",而是"类型T的value_type被定义为..."

第二件事是它用于简化泛型编程。(如果迭代器不适用于所有最简单的示例中的一个指向数组的指针,那么它就不是一个非常通用的概念。因此,我们使用一些元编程来填充指针被视为有效迭代器所需的细节)。

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

这篇关于什么是元编程?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

socks4 with asynchronous boost::asio(带有异步Boost::ASIO的socks4)
Boost ASIO HTTP client POST(增强ASIO HTTP客户端开机自检)
asio::strandlt;asio::io_context::executor_typegt; vs io_context::strand(Asio::strandlt;asio::io_context::executor_typegt;VS io_CONTEXT::Strand)
What#39;s the difference between asio::io_context and asio::thread_pool?(ASIO::IO_CONTEXT和ASIO::THREAD_POOL有什么区别?)
How to use boost::asio with Linux GPIOs(如何在Linux GPIO中使用Boost::ASIO)
Boost asio io_service vs io_context(增强ASIO io_服务与io_Context)