我试图了解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>();
}
Run Code Online (Sandbox Code Playgroud)
注释代码有效,但第一个没有.编译器给出了错误,指出存在重新定义且模板参数推断失败.有人能解释为什么会这样吗?这两个void_t
应该是独立的吗?由于一行检查x
而另一行检查y
.我该怎么办?
Vit*_*meo 14
这似乎与CWG问题#1980 (TC为纠正我的信用)有关.
作为一种解决方法,您可以定义void_t
为:
template<typename... Ts> struct make_void { typedef void type;};
template<typename... Ts> using void_t = typename make_void<Ts...>::type;
Run Code Online (Sandbox Code Playgroud)