문제

열거에 대한 템플릿 화 방법을 전문화 할 수 있습니까?

(아래의 잘못된 코드)와 같은 것 :

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
    {
        //...
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top