我想编写一个模板化函数,它采用 array<int, 3>
或 int[3]
。我试图在 enable_if
中捕获它:
template<typename T>
enable_if_t<is_array_v<T> && extent_v<T> == 3U || !is_array_v<T> && tuple_size<T>::value == 3U> foo(const T& param) {}
不幸的是,对于
int[3]
,未定义tupple_size
,这会导致模板在评估短路之前无法编译。我也尝试过使用
conditional
来做到这一点,但在考虑条件之前确保两个选项对 T
都有效有同样的问题。我知道我可以通过专业来做到这一点。但是函数体中的代码完全相同。我讨厌这样一个事实,即在实现相同的情况下我是专门的。
有没有办法在评估条件之前强制短路?
最佳答案
利用非数组类型的 extent<T>
为零因此为假的事实,disjunction
派生自列表中的第一个带有短路的真实类型:
template<typename T>
enable_if_t<disjunction<extent<T>, tuple_size<T>>::value == 3U> foo(const T& param) {}
这恐怕太聪明了。请注意,您不能在此处使用
disjunction_v
。conditional
也应该可以正常工作。诀窍是在您选择正确的类型之前不要要求 ::value
:template<typename T>
enable_if_t<conditional_t<is_array_v<T>, extent<T>, tuple_size<T>>::value == 3U>
foo(const T& param) {}
关于c++ - enable_if 中的短路运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52079896/