【发布时间】:2019-02-04 09:17:57
【问题描述】:
我想编写一个模板化函数,它接受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_v和const T& param。您当然可以使用特化来定义一个 trait 来控制 SFINAE,从而避免重复函数体。 -
@aschepler 对错别字很好。我只是从记忆中输入而不是复制 :( 总是一个糟糕的计划。你的特质评论可能是我正在寻找的。你能详细说明一下吗?
-
bolov 的回答中的
my_is_array或array_size_or_zero部分就是我所说的“定义特征”部分。
标签: c++ templates conditional short-circuiting enable-if