2012-05-11 2 views
2

TYPE이라는 클래스 열거 형인 경우를 제외하고는 아래 코드에서 Foo<T>::setValue이 내 용도로 적합합니다. Bar::TYPEBaz:TYPE. 같은 클래스의 수십있을 수 있기 때문에열거 형 인수에 대한 특수 멤버 템플릿

따라서, 나는 BarBaz 이름을 지정하지 않고 Foo<T>::setValue을 전문으로 도움을 주셔서 감사합니다 것입니다.

class Bar 
{ 
public: 
    enum TYPE{ ONE , TWO }; 
}; 

class Baz 
{ 
public: 
    enum TYPE{ SIX , TEN }; 
}; 

template<typename T> 
class Foo 
{ 
public: 
    void setValue(){} // Need a different setValue if T is a class enum 

private: 
    T m_value; 
}; 


int main() 
{ 
    Foo<int> f1; 
    Foo<Bar::TYPE> f2; 
    Foo<Baz::TYPE> f3; 
    return EXIT_SUCCESS; 
} 
+0

질문을 이해할 수 없습니다. 유형이 열거 형이면 무엇을하고 싶습니까? ''is_enum'과 함께'enable_if'를 사용할 수 있습니다. (http://msdn.microsoft.com/en-us/library/bb982983.aspx) – Flexo

+0

@awoodland'is_enum'을 살펴 보겠습니다. 'T'가 클래스 열거 형 (TYPE)이라면 다른 Foo :: setValue'을 원합니다. – Olumide

답변

5

: 버전 enable_if 후비는 is_enum 유형의 특성에 따라 사용할 수

#include <type_traits> 

template<typename T> 
class Foo 
{ 
public: 
    void setValue() { 
     setValueImpl<T>(); 
    } 
private: 
    template <class X> 
    typename std::enable_if<std::is_enum<X>::value, void>::type 
    setValueImpl() { std::cout << "Is enum" << std::endl; } 

    template <class X> 
    typename std::enable_if<!std::is_enum<X>::value, void>::type 
    setValueImpl() { std::cout << "Not enum" << std::endl; } 

    T m_value; 
}; 

.

이 예제에서는 C++ 11 enable_ifis_enum을 사용했지만 boost는 pre-C++ 11에서도 비슷했습니다.

+0

일종의 작품 비트는 열거 형을 구별하지 않습니다. 나는 그것을 할 수있는 특성을 만들어야한다고 생각합니다. – Olumide

+1

@Olumide'Bar :: TYPE'과'Baz :: TYPE'을 특별한 경우가되게하고 나머지는 모두 기본값으로하고 싶습니다. 그것이 당신이 찾고있는 것이라면 훨씬 쉬운 해결책이 있습니다. 그러나 유형을 어딘가에 지정해야합니다. 열거 형을 구별 할 수 없으며 열거 형을 구분할 수 없습니다. – Flexo

+0

나는 그것을 특성으로 명명하는 것을 고려하고 있었다. – Olumide

1

이것을 고려하십시오 : 당신은 같은 것을 사용하여이 작업을 수행 할 수

#include <iostream> 

class Bar 
{ 
public: 
    enum TYPE{ ONE , TWO }; 
}; 

class Baz 
{ 
public: 
    enum TYPE{ SIX , TEN }; 
}; 

template<typename T> 
class Foo 
{ 
public: 
    template<typename C> void setValue(const C &m_value, ...) 
    { 
     std::cout << "normal" << std::endl; 
    } 

    template<typename C> void setValue(const C &m_value, typename C::TYPE fake = C::TYPE()) 
    { 
     std::cout << "TYPE'ed" << std::endl; 
    } 

private: 
    T m_value; 
}; 


int main() 
{ 
    Foo<int> f1; 
    Foo<Bar> f2; 
    Foo<Baz> f3; 

    f1.setValue(1); 
    f2.setValue(Bar()); 
    f3.setValue(Baz()); 

    return 0; 
} 
+1

SFINAE에 대한 자세한 정보를 얻으실 수 있습니다 – inkooboo

+0

흥미 롭습니다. 'Bar :: TYPE()'을 쓸 수 있다는 것을 깨닫지 못했습니다. – Olumide