2017-04-14 1 views
0

내가 템플릿 클래스가있는 경우 : 나는 N의 값에 따라 클래스 멤버 _x의 유형을 제어하려는템플릿 인수를 기반으로 멤버 유형을 선택 하시겠습니까?

template<int N> 
class C{ 
    Something _x; 
} 

합니다. N이 0이고 _x가 A 유형이어야하고 그렇지 않으면 _x가 B 유형이어야한다고 말하십시오.

이것이 가능합니까?

사용할 형식을 결정하는 규칙을 위반하는 것이 가능하기 때문에 형식을 템플릿 매개 변수로 전달하기를 원하지 않습니다. 예를 들어 C<1, A>을 잘못 입력했을 수 있습니다.

답변

3

가능한 유형이 몇 가지 경우에는 std::conditional을 사용할 수 있습니다.

#include <type_traits> 

struct A {}; 
struct B {}; 

template<int N> 
class M { 
public: 
    std::conditional_t<N == 0, A, B> _x; 
}; 
2

가능합니까?

예. 너무 어렵지 않습니다. 당신이 원하는 경우

struct A {}; 
struct B {}; 

template <int N> struct c_member 
{ 
    using type = B; 
}; 

template <> struct c_member<0> 
{ 
    using type = A; 
}; 

당신은 c_member 더 전문을 추가 할 수 있습니다

template<int N> 
class C{ 
    typename c_member<N>::type _x; 
} 

.

+0

나는 (이것보다 간단함) 다른 답변으로 갈 것이지만, 고마워! – user997112

+0

@ user997112, 문제 없습니다. –

0

이렇게하는 방법에는 여러 가지가 있습니다. 나는 overloading을 좋아한다. asmit은 쉬운 확장 성을 허용한다. 지금

template<int N>using int_t=std::integral_constant<int,N>; 
template<class T>struct tag_t{using type=T; constexpr tag_t(){}}; 
template<class Tag>using type=typename Tag::type; 

struct A{}; struct B{}; 
inline tag_t<A> something(int_t<0>){return {};} 
template<int x> 
inline tag_t<B> something(int_t<x>){return {};} 

우리 단지 :

template<int N> 
class M { 
public: 
    type<decltype(something(int_t<N>{}))> _x; 
}; 

유일한 장점은이 유형을 선택하는 오버로드 확인의 전체 전력을 얻을, 당신은 템플릿 특수화와 엉망이없는, 그리고 돈 많은 경우를 다루기 위해 하나의 복잡한 조건부를 조건부로 만들어야합니다.

간단한 로직으로 두 가지 유형을 선택하는 경우 이는 과잉입니다.

관련 문제