Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 执行有关「;“非类型”;模板参数_C++_Templates - Fatal编程技术网

C++ 执行有关「;“非类型”;模板参数

C++ 执行有关「;“非类型”;模板参数,c++,templates,C++,Templates,我希望能够对类的“非类型”模板参数强制执行某些规则。这可能吗 例如,考虑一个模板化的“循环”类,它循环通过“类型”的值,在值“min”和“max”之间。 基本的第一步可能如下所示: template <class TYPE, TYPE MIN, TYPE MAX> class Cycle { public: Cycle() : m_value(MIN) { } const TYPE & value() const { return m_v

我希望能够对类的“非类型”模板参数强制执行某些规则。这可能吗

例如,考虑一个模板化的“循环”类,它循环通过“类型”的值,在值“min”和“max”之间。

基本的第一步可能如下所示:

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;
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;
    // ...
};
模板
班级循环
{
公众:
循环():
m_值(最小值)
{
}
常量类型和值()常量
{
返回m_值;
}
作废
{
如果(m_值==m_最大值)
m_值=m_最小值;
其他的
++m_值;
}
作废
{
如果(m_值==m_最小值)
m_值=m_最大值;
其他的
--m_值;
}
私人:
类型m_值;
静态型m_min;
静态类型m_max;
};
模板
类型周期::m_min=min;
模板
类型周期::m_max=max;

如何更改上述内容,以便规则MIN可以添加静态断言:

static_assert(MIN <= MAX, "Invalid bounds");

我只是好奇,
MAX+1>MIN
会不会导致语法错误?@fredwolflow:为什么会
i\u must\u true MIN-1)>
很好:-)你通过添加括号作弊:)
static_assert(MIN <= MAX, "Invalid bounds");
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;
    // ...
};