열거적 인 템플릿 전문화
-
06-07-2019 - |
문제
열거에 대한 템플릿 화 방법을 전문화 할 수 있습니까?
(아래의 잘못된 코드)와 같은 것 :
template <typename T>
void f(T value);
template <>
void f<enum T>(T value);
불가능한 경우, 나는 다음과 같은 여러 유형에 대한 전문 분야가 있다고 가정합니다. int
, unsigned int
, long long
, unsigned long long
, 그렇다면 열거 값이 어떤 전문 분야에서 사용됩니까?
해결책
당신이 사용할 수있는 std::enable_if
~와 함께 std::is_enum
~에서 <type_traits>
이것을 달성하기 위해.
내 질문 중 하나에 대한 답으로, litb 게시 a 매우 부스트 등가물로 이것이 어떻게 수행 될 수 있는지에 대한 상세하고 잘 작성된 설명.
다른 팁
귀하의 질문을 올바르게 이해하는지 확실하지 않지만 특정 열거에 템플릿을 인스턴스화 할 수 있습니다.
template <typename T>
void f(T value);
enum cars { ford, volvo, saab, subaru, toyota };
enum colors { red, black, green, blue };
template <>
void f<cars>(cars) { }
template <>
void f<colors>(colors) { }
int main() {
f(ford);
f(red);
}
아마도, 당신이 그것에 대해 알고있는 유형으로 만 할 수있는 유일한 흥미로운 일은 그것이 열거적이며, 기본 유형으로 캐스팅되어 작동한다는 것입니다. James의 제안 된 접근법을 사용하여 어떻게 보이는지 (일명 sfinae):
void Bar(int b); // and/or other underlying types
template<typename T>
typename std::enable_if<std::is_enum<T>::value, void>::type
Foo(T enm)
{
Bar(static_cast<typename std::underlying_type<T>::type>(enm));
}
관련 보너스로, 여기에는 특정 유형의 선택에 대해서만 해결되는 유사한 방법이 있습니다 (bool 켜짐을 바꾸십시오. is_same
선택한 유형) : :
template<typename T>
typename std::enable_if<std::is_same<T,bool>::value, void>::type
Baz(T bl)
{
if (bl)
{
//...
}
else
{
//...
}
}
제휴하지 않습니다 StackOverflow