당신은 만들 수 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
}
표준 라이브러리에서는이 유형을 작은 집합 이름으로 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'을 사용할 수 있습니다. 그 일에 많은 문제가 있다고 말할 수는 없습니다. –
@AmiTavory 죄송합니다. 이것이 내 질문에 대한 답변 인 방법에 대해 조금 분실했습니다. 좀 더 도와 줄 수있어? –
실제로 대답이 아니라 단지 의견입니다. 1. 라이브러리 규칙을 사용하면 템플릿 매개 변수는 UpperCase이고 소문자이므로 그림자가 발생하지 않으며 유형 이름이 무엇인지 쉽게 추측 할 수 있습니다. 2. 표준 라이브러리가 그것을하기 때문에, 그것은 쉬운 대안이 없다는 것을 나타내는 것입니다. 다시 말하지만 이것이 본격적인 대답이라고 생각하지 않는다. 그래서 나는 그것을 주석으로 썼다. –