내가 하려고 했는 방법을 이해하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>();
}
의 코드 작동하지만 첫 번째는't. 컴파일러가 내게 오는 것을 말하고있는 재정하고 있는 템플릿을 인수 추론하지 못했습니다. 할 수 있는 사람이 있었는 이유를 설명이 일어나는가? 두 개의void_t 의 독립적이어야 하죠? 때문에 하나를 선 검사를 위한
x다른
y`. 어떻게 해결할 수 있습니까?
이와 관련이 있을 것이다CWG 문제#1980(크레딧[T.C.](https://stackoverflow.com/users/2756719/t-c 의)수정 나).
해결책으로 정의할 수 있는void_t
로:
template<typename... Ts> struct make_void { typedef void type;};
template<typename... Ts> using void_t = typename make_void<Ts...>::type;