2016-09-27 4 views
0

CLASS::TYPE을 통해 공개적으로 사용할 수 있도록 일부 템플릿 매개 변수를 사용하는 클래스가 있습니다. 이를 위해 나는 항상 같은 공공 형식 정의를 수행템플릿 매개 변수를 공용으로 만드는 효율적인 방법?

template <class Tx> 
Class C 
{ 
public: 
typedef Tx Ty; 

}; 

이 2 개 이유로 어색 : 그것은 느낌

  • (투박하고
  • 내가 두 개의 서로 다른 이름을 줄 필요가 그림자를 피하기 위해 중복 TxTy)을 사용하면 실제로 버그가 발생합니다.

더 좋은 방법이 있나요?

+1

표준 라이브러리에서는이 유형을 작은 집합 이름으로 typedef하는 것이 일반적입니다. ['element_type'] (http://en.cppreference.com/w/cpp/memory/shared_ptr), ['value_type'] (http://stackoverflow.com/questions/9637094/is-it-a-good-practice-to-always-define-value-type-when-we-define- a-template), 또는'type'을 사용할 수 있습니다. 그 일에 많은 문제가 있다고 말할 수는 없습니다. –

+0

@AmiTavory 죄송합니다. 이것이 내 질문에 대한 답변 인 방법에 대해 조금 분실했습니다. 좀 더 도와 줄 수있어? –

+0

실제로 대답이 아니라 단지 의견입니다. 1. 라이브러리 규칙을 사용하면 템플릿 매개 변수는 UpperCase이고 소문자이므로 그림자가 발생하지 않으며 유형 이름이 무엇인지 쉽게 추측 할 수 있습니다. 2. 표준 라이브러리가 그것을하기 때문에, 그것은 쉬운 대안이 없다는 것을 나타내는 것입니다. 다시 말하지만 이것이 본격적인 대답이라고 생각하지 않는다. 그래서 나는 그것을 주석으로 썼다. –

답변

1

당신은 만들 수 decltype 구문, 공제 및 태그 파견의 사용 :

template <class Tx> 
struct C { }; 

template <class T> 
struct tag { }; 

template <class T> 
T deduceCTx(tag<C<T>>); 

// now to extract type: 
decltype(deduceCTx(tag<C<int>>{})) a; // a is of type int 

보다 일반적인 경우에는 어떤 템플릿 형식 매개 변수를 추출하기를 추론 기능을 만들 수 있습니다 (때 적어도 C++ 11을 사용) 템플릿 템플릿 구문과 가변 인자 템플릿을 사용하여 :

#include <tuple> 

template <class Tx> 
struct C { }; 

template <class T> 
struct tag { }; 

template <size_t N, template <class...> class TT, class... Args> 
typename std::tuple_element<N, std::tuple<Args...>>::type 
    deduceAnyTypeTemplateParameter(tag<TT<Args...>>); 

// now to extract type: 
decltype(deduceAnyTypeTemplateParameter<0>(tag<C<int>>{})) a; // a is of type int 

당신은 유형 별칭 활용하여 공제의 사용을보다 편리하게 할 수있는 C++ (14)를 사용하는 경우 :

#include <tuple> 

template <class Tx> 
struct C { }; 

template <class T> 
struct tag { }; 

template <size_t N, template <class...> class TT, class... Args> 
typename std::tuple_element<N, std::tuple<Args...>>::type 
    deduceAnyTemplateParameter(tag<TT<Args...>>); 

// now to use passed type: 
decltype(deduceAnyTemplateParameter<0>(tag<C<int>>{})) a; // a is of type int 

template <size_t N, class T> 
using TemplateParameter = decltype(deduceAnyTemplateParameter<N>(tag<T>{})); 

int main() { 
    TemplateParameter<0, C<int>> i; // i of type int 
} 
+1

깔끔한 트릭이긴하지만, 나는 OP가 뭔가를 덜 찾고 있다고 생각한다. * 덜 어색하고 어색하다. – molbdnilo

+0

접근 방식이 어색하고 어색하지만 문제가 아니라고 생각합니다. –

관련 문제