【发布时间】:2017-06-30 11:57:41
【问题描述】:
我试图了解SFINAE 的工作原理,并且正在尝试使用此代码
#include <type_traits>
struct One {
using x = int;
};
struct Two {
using y = int;
};
template <typename T, std::void_t<typename T::x>* = nullptr>
void func() {}
template <typename T, std::void_t<typename T::y>* = nullptr>
void func() {}
/*template <typename T, std::enable_if_t<std::is_same_v<typename T::x, typename T::x>>* = nullptr>
void func() {}
template <typename T, std::enable_if_t<std::is_same_v<typename T::y, typename T::y>>* = nullptr>
void func() {} */
int main() {
func<One>();
func<Two>();
}
注释的代码有效,但第一个无效。编译器给了我错误,说有重新定义并且模板参数推导失败。有人可以解释为什么会这样吗?两个void_ts 应该是独立的吧?因为一行检查x,另一行检查y。我该如何解决?
【问题讨论】:
-
请注意,这适用于
make_voidtrick。