【问题标题】:C++ template default parameterC++ 模板默认参数
【发布时间】:2015-05-09 04:31:47
【问题描述】:

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

程序第一行的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++ 评估测试的问题,我正在努力理解。

【问题讨论】:

标签: c++ templates


【解决方案1】:

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

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

A<int, -9>::m_value

intT使用的数据类型,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

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

【讨论】:

  • 谢谢!。同样 bool() 为 0,所以上述程序的输出为 -110
【解决方案2】:

是的,这是类模板的默认参数示例。您会发现此示例很有帮助 https://msdn.microsoft.com/en-us/library/bys786s7.aspx

【讨论】:

    【解决方案3】:

    简而言之,是的,它确实为第二个模板参数提供了默认值。您可以在A&lt;char&gt;::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 类型的默认值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      • 2015-02-04
      相关资源
      最近更新 更多