Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+中是否全部使用模板+;元编程? 我试图理解元编程一般是什么,特别是C++中的内容。如果我搜索C++元编程,我会得到模板元编程(TMP)教程,但没有解释它只对模板的具体使用或模板的所有用法进行分类。 我的问题是C++中模板的所有用法是否被归类为元编程。解释它是或不是的原因也会有帮助。谢谢。< P>当用模板编写C++函数时,你正在为编译器写“指令”,告诉它在遇到函数调用时要做什么。从这个意义上讲,您不是直接编写代码,因此我们称之为元编程 是的,每个涉及模板的C++代码都被认为是元编程< /P>_C++_Templates_Metaprogramming_Template Meta Programming - Fatal编程技术网

在C+中是否全部使用模板+;元编程? 我试图理解元编程一般是什么,特别是C++中的内容。如果我搜索C++元编程,我会得到模板元编程(TMP)教程,但没有解释它只对模板的具体使用或模板的所有用法进行分类。 我的问题是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 &

请注意,只有定义模板、函数或类的部分是元编程。正则函数和类被归类为规则C++!p> 我的问题是C++中模板的所有用法是否被归类为元编程?< /P> 没有

并非C++中所有模板的用法都是元编程。

显然,这是一个定义问题,但是在C++中,元编程是编译时计算的同义词。p> 因此,我们使用模板进行元编程(特别是模板元编程),但并非所有模板的使用都是元编程

一个简单的反例

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 }; };