我希望能够对类的"非类型"模板参数强制执行某些规则.这可能吗?
例如,考虑一个模板化的"循环"类,它在值"MIN"和"MAX"之间循环通过"TYPE"类型的值.
基本的第一步可能如下所示:
template <class TYPE, TYPE MIN, TYPE MAX>
class Cycle
{
public:
Cycle() :
m_value(MIN)
{
}
const TYPE & value() const
{
return m_value;
}
void up()
{
if (m_value == m_max)
m_value = m_min;
else
++m_value;
}
void down()
{
if (m_value == m_min)
m_value = m_max;
else
--m_value;
}
private:
TYPE m_value;
static TYPE m_min;
static TYPE m_max;
};
template <class TYPE, TYPE MIN, TYPE MAX>
TYPE Cycle<TYPE, MIN, MAX>::m_min = MIN;
template <class TYPE, TYPE MIN, TYPE MAX>
TYPE Cycle<TYPE, MIN, MAX>::m_max = MAX;
Run Code Online (Sandbox Code Playgroud)
如何更改上述内容以使规则MIN <= MAX始终保持?即如何确保程序员使用该行
Cycle<int, 0, 23> hoursInADay;
Run Code Online (Sandbox Code Playgroud)
将被允许,但程序员使用该行
Cycle<int, 23, 0> hoursInADay;
Run Code Online (Sandbox Code Playgroud)
将在编译时警告该声明是不可接受的?
您可以添加静态断言:
static_assert(MIN <= MAX, "Invalid bounds");
Run Code Online (Sandbox Code Playgroud)
在C++ 11之前,您必须编写自己的构造,在falsebool 上调用时会产生编译时错误; 例如,采用Boost的static-assert版本.
否则这样的事情:
template <bool B> struct i_must_be_true; // no definition!
template <> struct i_must_be_true<true> { };
template <typename T, T MIN, T MAX> class Cycle
{
i_must_be_true<MIN <= MAX> m_check;
// ...
};
Run Code Online (Sandbox Code Playgroud)