如何处理非类型模板参数上的条件

How can conditions on non-type template parameters be handled?

本文关键字:参数 条件 类型 何处理 处理      更新时间:2024-09-27

非类型模板参数的一个例子是一个数组:

template <typename T, int size> // size is an integral non-type parameter
class StaticArray
{
private:
// The non-type parameter controls the size of the array
T m_array[size] {};
}

处理输入中的负值有哪些选项?使用std::is_signed并不真正适用-模板参数被定义为已签名,因此无论提供的实际值是否为,类型都将始终被签名。

在我的系统上,std::array中的实现似乎将类型设置为std::size_t,这不是我在用例中所需要的。我希望能在std::enable_if中使用一些东西,其中负值是有效的,但有不同的方法实现。

我尝试了以下操作,但编译器似乎不确定如何区分">"运算符与">"作为模板指示。

template<>
Iterator& operator++(std::enable_if_t<SIZE > 0>) { m_ptr++; return *this; }  
template<>
Iterator& operator++(std::enable_if_t<SIZE < 0>) { m_ptr--; return *this; }  

[编辑]我不知道constexpr-if,这似乎是一种更好的方法,但它是C++17(我最初的标签是C++11,但我现在添加了C++17(。

以下内容至少是编译的,看起来比有条件添加的方法更可读,但我不确定这是否是推荐的方法:

Iterator& operator++()
{
if constexpr (SIZE > 0)
m_ptr++;
else if constexpr (SIZE < 0)
m_ptr--;
else
static_assert(SIZE == 0, "SIZE cannot be zero.");
return *this;
}

[编辑2]对于非类型模板参数,我不清楚enable_if/enable_if_t的语法。在条件周围添加括号时,两者都无法编译。

启用_if_t后,我得到

error: argument may not have 'void' type
Iterator& operator++(std::enable_if_t<(SIZE > 0)>) { m_ptr++; return *this; }
^

使用enable_if,我得到

error: parameter of overloaded post-increment operator must have type 'int' (not 'std::enable_if<(2 > 0)>')
Iterator& operator++(std::enable_if<(SIZE > 0)>) { m_ptr++; return *this; }
^

下面是一个开始的示例:

template <typename T, int size> // size is an integral non-type parameter
class StaticArray
{
private:
T m_array[size] {};
public:
std::enable_if_t<(size > 0), Iterator&>
operator++() { /* ... */ }
};