我必须处理一个我完全感到困惑的代码。
#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;
}
你能评论下一行吗?
static const int m_value = B<(t > T())>::m_n - B<(t < T())>::m_n;
如何使用更多和更少运算符?
我无法弄清楚如何使用第二个模板:
template<bool b>
答案 0 :(得分:5)
B
是一个(嵌套的)类模板,其中包含bool
模板参数(b
);当m_n
为1
时,其静态成员b
为true
,0
为b
时为false
。
t > T()
测试值t
(A
的模板参数)是否大于值初始化T
。由于T
必须是非类型模板参数的有效类型,因此T()
等效于T(0)
,即以正确类型表示的零。
然后将该测试的结果用作B
的模板参数。等效代码如下所示:
public:
static const T t0 = T();
static const bool b1 = t > t0;
static const bool b2 = t < t0;
static const int m_value = B<b1>::m_n - B<b2>::m_n;
答案 1 :(得分:3)
请注意,默认构造函数T()
零初始化内置类型。所以
B<(t > T())>::m_n
如果t
为正数,则为1,否则为0,
B<(t < T())>::m_n
如果t
为负数,则为1,否则为0。因此
B<(t > T())>::m_n - B<(t < T())>::m_n
如果t
为正,则为1;如果为零,则为0;如果为负,则为-1。