我昨天读到了C ++中的表达式参数: http://www.learncpp.com/cpp-tutorial/144-expression-parameters-and-template-specialization/
我知道你为什么使用模板,但为什么在使用构造函数来完成同样的事情时使用表达式参数呢? 哦,还有一件事,是由预编译器处理的模板吗?
先谢谢你。
答案 0 :(得分:1)
当您使用模板类时,它将在编译时进行扩展,然后像普通类一样进行编译。在构造函数中使用表达式参数而不是参数的一个原因是表达式成为类型的一部分。因此,保证该类型的所有对象都使用相同的值。
在您链接到的示例中:
// 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是相同类型的对象,但它们具有不同的缓冲区大小。
答案 1 :(得分:1)
简单示例 - C ++ 11数组(和之前的boost类似)。 http://en.cppreference.com/w/cpp/container/array
静态数组是一种不能使用变量的情况,但您可以使用模板参数。
在其他情况下,使用常量(模板参数)可能更有效。
预处理器不接触模板,只执行#whatever
行,扩展宏,删除注释等。
答案 2 :(得分:1)
问题的第二部分首先:不,编译模板;没有预处理。
关于第一部分,它们非常有用。在模板中具有强大功能的表达式参数的最佳(也是最简单)示例是静态数组的大小限制:
#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.
没有表达式参数,这样的事情是不可能的。它们非常有用,特别是对于需要缩小尺寸的东西。