【发布时间】:2014-07-11 08:13:19
【问题描述】:
我正在使用以下 SFINAE 模式来评估可变参数类型列表上的谓词:
#include <type_traits>
void f(int = 0); // for example
template<typename... T,
typename = decltype(f(std::declval<T>()...))>
std::true_type check(T &&...);
std::false_type check(...);
template<typename... T> using Predicate = decltype(check(std::declval<T>()...));
static_assert(!Predicate<int, int>::value, "!!");
static_assert( Predicate<int>::value, "!!");
static_assert( Predicate<>::value, "!!"); // fails
int main() {
}
令我惊讶的是,当使用空参数列表调用 check 时选择了省略号重载,因此即使 SFINAE 表达式有效,Predicate<> 也是 std::false_type!
不应该总是首选可变参数函数模板而不是省略号函数吗?
有什么解决方法吗?
【问题讨论】:
-
我认为这取决于这个神秘的部分>> “一些涉及 T... 的 SFINAE 表达式” 我相信当
T...扩展为空集时,这部分会拒绝重载.你需要揭开谜底。 -
你能写出实际的代码吗?还是产生此问题的代码?
-
有趣的角落案例。它有什么用?
-
当非模板函数都是可行的重载候选并且同样匹配良好时,这是否只是一种偏爱非模板函数而不是模板的情况?
-
@Casey 正是我的想法。省略号通常排名较低,因为 省略号转换序列 在此处未应用,因为没有参数。
标签: c++ templates c++11 variadic-templates sfinae