如何处理非类型模板参数上的条件
How can conditions on non-type template parameters be handled?
非类型模板参数的一个例子是一个数组:
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++() { /* ... */ }
};
相关文章:
- 如果条件,当我想第二个参数时
- 有条件地将默认参数传递给函数(使用"?"运算符)
- 在 constexpr-if 条件下比较 constexpr 函数参数会导致错误
- 用于根据条件选择编译时类型的可变参数模板
- 我可以有条件地使用多个参数吗?
- 在解压缩可变参数模板时避免"recursive"函数调用,直到运行时条件
- 使用 std::条件根据模板参数选择成员类型
- 具有条件的C 模板非类型参数
- 如何避免参数数量依赖于条件的调用分支?
- 有条件的操作员从其参数的副本中返回值
- 根据模板参数条件 C++17 创建成员别名
- 当条件为真时,有没有办法连接宏参数
- C++:无法使用条件类型在模板函数中使用 'double' 类型的 lvalue 初始化 'char*' 类型的参数
- 参数大小可变的函数:如何有条件地设置一些参数?
- 根据数值模板参数有条件地编译转换运算符
- 如果参数条件为 true,则阻止执行返回函数
- 在哪些条件下,我们将指针作为函数参数
- 基于模板类型参数的条件成员签名和实现
- 有条件地将基类引用参数视为派生类并将其返回
- 预处理器和模板参数或代码段的条件编译