SFINAE를 사용하여 한 번에 여러 유형의 구조체 템플릿을 특수화하려고합니다.기본 템플릿을 건드리지 않고 SFINAE 부분 특수화 사용
#include <iostream>
template <typename T, typename Enable = void>
struct S {
void operator()() {
std::cout << "Instantiated generic case" << std::endl;
}
};
template<typename T>
using enabled_type = typename std::enable_if<
std::is_same<T, int>::value ||
std::is_same<T, float>::value
>::type;
template <typename T>
struct S<T, enabled_type<T>> {
void operator()() {
std::cout << "Instantiated int/float case" << std::endl;
}
};
int main() {
S<float>()();
return 0;
}
내 문제는 내가 외부 헤더 전용 라이브러리의 일부로서, typename Enable = void
을 추가 할 S
구조체의 기본 템플릿을 수정할 수 있다는 것입니다 : 나는 다음과 같은 작품 같은 것을 알고있다. 따라서 기본 템플릿은 다음과 같이 표시되어야합니다.
이 템플릿을 특수화하기 위해 SFINAE를 사용할 수있는 방법이 있습니까?
편집 : S
구조체는 외부 라이브러리의 코드에 의해 사용되는 주, 그래서 실제로 S
을 전문으로해야 할 것이다 그것을 서브 클래스 수 없습니다. 또한 실제 코드는 훨씬 복잡하고 SFINAE에서이 간단한 예제 (나는 여러 유형의 모든 조합에 대해 특수화해야하는 여러 템플릿 매개 변수가 있음)보다 많은 이점을 얻을 것입니다.
'T'의 실제 형태에 따라 다음과 같이 도움이 될 수 있습니다. https://stackoverflow.com/a/30991097/4326278 – bogdan