表达式参数在 C++ 中有什么用

what use are expression parameters in c++?

本文关键字:什么 C++ 参数 表达式      更新时间:2023-10-16

我昨天读到了C++中的表达式参数:http://www.learncpp.com/cpp-tutorial/144-expression-parameters-and-template-specialization/

我知道你为什么使用模板,但是当你可以使用构造函数来完成同样的事情时,为什么要使用表达式参数呢?哦,还有一件事,模板是由预编译器处理的吗?

提前谢谢你。

当您使用模板类时,它将在编译时扩展,然后像普通类一样编译。在构造函数中使用表达式参数而不是参数的一个原因是表达式成为类型的一部分。因此,将保证该类型的所有对象使用相同的值。

在您链接到的示例中:

// 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 是同一类型的对象,但它们具有不同的缓冲区大小。

简单的例子 - C++11 数组(和 boost 之前也有类似的)。http://en.cppreference.com/w/cpp/container/array

静态数组是不能使用变量但可以使用模板参数的一种情况。

在其他情况下,使用常量(模板参数)也可能更有效。

预处理器不接触模板,它只执行#whatever行,扩展宏,删除注释等。

首先是问题的第二部分:不,模板是编译的;不是预处理的。

关于第一部分,它们非常有用。表达式参数的最佳(也是最简单的)示例是静态数组的大小限制,该表达式参数在模板中具有强大的功能:

#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.

没有表达式参数,这些事情是不可能的。它们非常有用,特别是对于需要扣除大小的东西。