繁体   English   中英

C ++模板默认参数

[英]C++ template default parameter

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

程序第一行的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/zh-cn/library/bys786s7.aspx

简而言之,是的,它确实为第二个模板参数提供了默认值。 您会在A<char>::m_value行中看到T t = T()A<char>::m_value 由于第二模板参数被初始化为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;
}

该函数返回0,如果t等于类型的默认值T ,-1,如果t小于类型的默认值T ,和1如果t比类型的默认值大T

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM