C++模板默认参数

标签 c++ templates

我知道简单模板和模板特化的工作原理,但我对此感到困惑。

程序第一行的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

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

现在尝试自己找出其余部分。

关于C++模板默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28917941/

相关文章:

c++ - 访问超出范围的变量而不传递它们?

c++ - 我如何创建一个将模板对象与其自己的模板列表相关联的方法?

c++ - 直接将数组写入参数会在 C++ 中出错

c++ - 与 SFINAE 中的硬错误混淆

c++ - 错误 : stray ‘\224’ in program after including external library

c++ - 如何实现几个函数的编译时多态?

c++ - Rust与C++ : Returning objects from functions

c++ - 如何将一个类(class)的成员传递给另一个类(class)的另一个成员

c++ - 使用 SFINAE 解决过载歧义

以派生类为参数的 C++ 基类构造函数(?)