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
现在试着自己解决剩下的问题。
简而言之,是的,它确实为第二个模板参数提供了默认值。在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。
相关文章:
- 使函数参数默认为周围范围
- 如何将值传递给其参数(默认参数)
- 当“std::make_index_sequence”和“std::index_sequence”用于模板参数默认类型时
- C ,构造器中允许的参考参数默认值
- 哪些规则控制参数默认赋值?
- 错误:上一个规范后给出的参数默认参数
- 是否可以设计一个包含模板参数默认值的类
- 构造函数中参数C++默认值
- 如何设置依赖于其他参数的参数默认值
- C++模板参数默认函数实现
- QInput对话框参数默认值
- g++4.8.2上列表方法参数默认初始化时出错
- 在函数定义中指定参数默认值会导致错误 C2143:语法错误:'='之前缺少')'
- 函数模板:将第一个模板参数默认为第二个
- 模板模板参数默认可以引用其他模板类型的参数
- 参数默认为先例参数的值
- 如何修改一个类,使它只有一个成员函数,所有参数默认
- 内置类型的模板参数默认值
- 是否可以使用构造函数或对象作为其他类方法的参数默认值?
- 模板参数默认为更高版本