我昨天阅读了 C++ 中的表达式参数:http: //www.learncpp.com/cpp-tutorial/144-expression-parameters-and-template-specialization/
我知道你为什么使用模板,但是当你可以使用构造函数来完成同样的事情时,为什么还要使用表达式参数呢?哦,还有一件事,模板是否由预编译器处理?
先感谢您。
我昨天阅读了 C++ 中的表达式参数:http: //www.learncpp.com/cpp-tutorial/144-expression-parameters-and-template-specialization/
我知道你为什么使用模板,但是当你可以使用构造函数来完成同样的事情时,为什么还要使用表达式参数呢?哦,还有一件事,模板是否由预编译器处理?
先感谢您。
简单示例 - C++11 数组(和 boost 之前类似)。 http://en.cppreference.com/w/cpp/container/array
静态数组是不能使用变量但可以使用模板参数的一种情况。
在其他情况下,使用常量(模板参数)也可能更有效。
预处理器不接触模板,它只执行#whatever
行、扩展宏、删除注释等。
当您使用模板类时,它将在编译时扩展,然后像普通类一样编译。在构造函数中使用表达式参数而不是参数的一个原因是表达式成为类型的一部分。因此,该类型的所有对象都将保证使用相同的值。
在您链接到的示例中:
// declare an integer buffer with room for 12 chars
Buffer<int, 12> cIntBuffer;
cIntBuffer 是 Buffer 类的一个实例。保证有一个大小为 12 的 int 缓冲区。如果你有:
Buffer<int> cIntBuffer1(12);
Buffer<int> cIntBuffer2(13);
cIntBuffer1 和 cIntBuffer2 是相同类型的对象,但它们的缓冲区大小不同。
您问题的第二部分首先:不,模板已编译;未经预处理。
关于第一部分,它们非常有用。在模板中具有强大功能的表达式参数的最佳(也是最简单)示例是静态数组的大小限制:
#include <iostream>
using namespace std;
template<typename T, size_t N>
void DoSomething(const T (&ar)[N])
{
for (size_t i=0; i<N; ++i)
cout << ar[i] << endl;
}
int main(int argc, char *argv[])
{
int int_ar[] = { 1,2,3,4,5 };
DoSomething(int_ar);
char char_ar[] = {'a', 'b', 'c'};
DoSomething(char_ar);
std::string str_ar[] = {"This", "is", "a", "string", "array."};
DoSomething(str_ar);
return EXIT_SUCCESS;
}
输出
1
2
3
4
5
a
b
c
This
is
a
string
array.
如果没有表达式参数,这些事情是不可能的。它们非常有用,特别是对于需要缩小尺寸的东西。