C++模板默认参数

C++ template default parameter

本文关键字:参数 默认 C++      更新时间:2023-10-16

我知道简单的模板和模板专业化是如何工作的,但我对此感到困惑。

程序第一行的T t = T()在做什么?这是默认参数吗?如何确定程序的输出?

#include <iostream>
template<class T, T t = T()>
class A
{
private:
    template<bool b>
    class B
    {
    public:
        static const int m_n = b ? 1 : 0;
    };
public:
    static const int m_value = B<(t > T())>::m_n - B<(t < T())>::m_n;
};
int main()
{
    std::cout << A<int, -9>::m_value
              << A<bool, true>::m_value
              << A<char>::m_value << std::endl;
    return 0;
}

这是一个关于C++评估测试的问题,我正在努力理解。

是。第二个参数是此模板的默认参数。

如果您知道这一点,那么输出的确定应该是相当直接的。我会为你做第一件事:

A<int, -9>::m_value

int是用于T的数据类型,而int t的值是-9

此行:

static const int m_value = B<(t > T())>::m_n - B<(t < T())>::m_n;

获取评估结果如下(其中int()为零):

static const int m_value = B<(-9 > 0)>::m_n - B<(-9 < 0)>::m_n;

评估如下:

static const int m_value = B<false>::m_n - B<true>::m_n;

评估如下:

static const int m_value = 0 - 1;

最终评估为:

static const int m_value = -1;

因此:

std::cout << A<int, -9>::m_value

与相同

std::cout << -1

现在试着自己解决剩下的问题。

是的,这是类模板默认参数的一个例子https://msdn.microsoft.com/en-us/library/bys786s7.aspx

简而言之,是的,它确实为第二个模板参数提供了默认值。在A<char>::m_value行中可以看到T t = T()的使用。由于第二个模板参数默认初始化为T()T的默认构造函数),因此t将采用您提供的任何类型的默认值作为第一个模板参数。然后,程序将作为第二模板参数给定的值与作为第一模板参数给定类型的默认值进行比较。把它想象成下面的函数,如果我正确理解了类,做同样的事情。

template<class T>
// T t = T() in a function is the same as your T t = T()
// in your template parameters
int f(T t = T())
{
    return (T() == t) ? 0 : ((T() < t) ? 1 : -1);
}

用法:

int main(int argc, char *argv[]) {
    std::cout << f<int(-9)
              << A<bool>(true)
              << A<char>() << std::endl;
}

如果t等于类型T的默认值,则函数返回0,如果t小于类型T的默认值则返回-1,如果t大于类型T的默认值时返回+1。