在C+中是否全部使用模板+;元编程? 我试图理解元编程一般是什么,特别是C++中的内容。如果我搜索C++元编程,我会得到模板元编程(TMP)教程,但没有解释它只对模板的具体使用或模板的所有用法进行分类。 我的问题是C++中模板的所有用法是否被归类为元编程。解释它是或不是的原因也会有帮助。谢谢。< P>当用模板编写C++函数时,你正在为编译器写“指令”,告诉它在遇到函数调用时要做什么。从这个意义上讲,您不是直接编写代码,因此我们称之为元编程 是的,每个涉及模板的C++代码都被认为是元编程< /P>
请注意,只有定义模板、函数或类的部分是元编程。正则函数和类被归类为规则C++!p> 我的问题是C++中模板的所有用法是否被归类为元编程?< /P> 没有 并非C++中所有模板的用法都是元编程。 显然,这是一个定义问题,但是在C++中,元编程是编译时计算的同义词。p> 因此,我们使用模板进行元编程(特别是模板元编程),但并非所有模板的使用都是元编程 一个简单的反例在C+中是否全部使用模板+;元编程? 我试图理解元编程一般是什么,特别是C++中的内容。如果我搜索C++元编程,我会得到模板元编程(TMP)教程,但没有解释它只对模板的具体使用或模板的所有用法进行分类。 我的问题是C++中模板的所有用法是否被归类为元编程。解释它是或不是的原因也会有帮助。谢谢。< P>当用模板编写C++函数时,你正在为编译器写“指令”,告诉它在遇到函数调用时要做什么。从这个意义上讲,您不是直接编写代码,因此我们称之为元编程 是的,每个涉及模板的C++代码都被认为是元编程< /P>,c++,templates,metaprogramming,template-meta-programming,C++,Templates,Metaprogramming,Template Meta Programming,请注意,只有定义模板、函数或类的部分是元编程。正则函数和类被归类为规则C++!p> 我的问题是C++中模板的所有用法是否被归类为元编程?< /P> 没有 并非C++中所有模板的用法都是元编程。 显然,这是一个定义问题,但是在C++中,元编程是编译时计算的同义词。p> 因此,我们使用模板进行元编程(特别是模板元编程),但并非所有模板的使用都是元编程 一个简单的反例 template <typename K, typename V> void printKeyVal (K const &
template <typename K, typename V>
void printKeyVal (K const & k, V const & v)
{ std::cout << k << ": " << v << std::endl; }
模板
无效printKeyVal(K常量和K,V常量和V)
{STD:::Cuth:C++中的TMP是什么?
模板元编程(TMP)C++是一种在C++中用编译模板来表示和执行任意算法的技术,通常使用模板特化来模拟条件分支和递归模板定义来模拟循环。最著名的例子是编译时阶乘计算:
template <unsigned int n>
struct factorial {
// recursive definition to emulate a loop or a regular recursion
enum { value = n * factorial<n - 1>::value };
};
// specialization that describes "break" condition for the recursion
template <>
struct factorial<0> {
enum { value = 1 };
};
标准标头提供的大多数实用程序都是使用TMP技术实现的
鉴于TMP算法是使用类型定义表示的,值得一提的是,TMP是一种不使用显式控制流语句来表示计算逻辑的形式(if
,else
,for
,等等)
C++模板的所有用法都是元编程吗?
简而言之,答案是:不。如果模板不用于表示编译时算法,那么它就不是元编程,而是一个复杂的过程
<> P> C++中引入模板的主要目的是实现泛型编程,即允许重用相同的算法(<代码>查找< /COD>,<代码>拷贝<代码>,<代码>排序>代码>等)和数据结构(<代码>向量<代码> >代码>列表>代码>代码>地图>代码>…对于满足特定要求的任何类型,包括用户定义的类型
实际上,C++中的TMP不是模板的使用,
<> P> >:<>强> C++中的模板元编程是使用模板来表示编译时算法,C++模板的其他用法大部分是泛型编程的一种形式。>/P>
我试图理解元编程一般是什么,C++中的内容是什么特别是
一般来说,您还没有说出元编程所理解的内容,因此您的答案没有一个共同的起点
我将假设这一点已经足够好了:
元编程是一种编程技术,在这种技术中,计算机程序能够将其他程序视为其数据
…可用于将计算从运行时移动到编译时,使用编译时计算生成代码
C++一般不允许自我修改代码,所以我忽略了这一点。我还选择不计算预处理器,因为编译时(或者可以说是之前)的文本替换与对程序语义的操作不同
我的问题是C++中模板的所有用法是否被归类为元编程< /p>
不,不是
考虑一下,以供参考:
#define MAX(a,b) ((a) > (b) ? (a) : (b))
这是在不使用模板的情况下编写泛型(类型不可知)max
函数的松散方式。我已经说过,我不将预处理器视为元编程,但在任何情况下,每当使用它时,它总是生成相同的代码
它只是简单地委托解析该代码,并担心类型以及a>b
是否定义给编译器(在以后的版本中)。这里的任何操作都不会在编译时根据…产生不同的结果代码。编译时,不会计算任何内容
现在,我们可以比较模板版本:
template <typename T>
T max(T a, T b) { return a > b ? a : b; }
模板
T max(ta,tb){返回a>b?a:b;}
这不仅仅是执行文本替换。实例化的过程更复杂,可能会考虑名称查找规则和重载,并且在某种意义上不同的实例化可能在文本上并不等价(例如,当我键入“cp a.txt b.txt”时,可以使用bool::operator<(T,T)
和一个bool T::operator)在BASH中,即使我使用的是完全编程环境,也不是编程。同样地,当我使用<代码> STD::vector < /代码>时,我指示编译器生成程序(所以它确实是元的),但是指令本身并不是一个程序。大多数人不考虑使用宏“元编程”。你的答案是完全错误的!请阅读本线程中给出的其他答案,以获得MTP的基本理解。每当你编写没有模板的C++时,你就为编译器编写指令。metaprogramming@JohannesScHub LITB在C++环境中,这个术语有一个不同于IrrC的特定含义,它最初引用的是C++中模板的经典用法不是元编程(除非使用非C++术语元编程)。
template <typename T>
T max(T a, T b) { return a > b ? a : b; }
template <unsigned N>
struct factorial() { enum { value = N * factorial<N-1>::value }; };