我想编写一个模板化函数,它采用 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/

10-11 22:58