8

Я хотел бы знать, как написать класс type_traits, чтобы определить, являются ли два типа специализациями одного и того же класса шаблонов. Большая проблема заключается в том, что она должна работать для смешанных типов/не-типов шаблона класса как:Определить, являются ли два типа специализацией одного и того же шаблона класса?

template <typename T, std::size_t N> 
class MyClass {}; 

Можно ли создать такую ​​вещь?

+0

@rhalbersma, а не дубликат, а другой вопрос хочет знать, как скажите, используют ли две специализации одно и то же определение, т. е. используют первичный шаблон или оба используют одну и ту же частичную специализацию или оба используют ту же самую явную специализацию. Насколько я могу судить, здесь не вопрос. –

+0

@ Vincent, нужно ли черту работать для обнаружения использования шаблона _any_ класса или просто для 'MyClass'? Я не думаю, что вообще возможно для шаблонов классов, используя сочетание параметров типа и не-типа. –

+0

@JonathanWakely удалил комментарий, похоже, не в состоянии отозвать закрытый голос. – TemplateRex

ответ

1

Я не думаю, что вы можете сделать это вообще для произвольного шаблона класса с сочетанием параметров типа и не-типа.

Вы можете приблизиться к более конкретным наборам параметров, но я не знаю, какое-либо образом обрабатывать общий случай:

#include <type_traits> 

template <typename T, std::size_t N> 
class MyClass {}; 

// assume not the same 
template<typename T, typename U> 
struct my_trait : std::false_type 
{ }; 

// both specializations of MyClass 
template<typename T1, std::size_t N1, typename T2, std::size_t N2> 
struct my_trait<MyClass<T1, N1>, MyClass<T2, N2>> 
: std::true_type 
{ }; 

// both specializations of some class template Templ<typename, std::size_t> 
template<template<typename, std::size_t> class Templ, typename A1, std::size_t S1, typename A2, std::size_t S2> 
struct my_trait<Templ<A1, S1>, Templ<A2, S2>> 
: std::true_type 
{ }; 

// both specializations of some class template Templ<typename...> 
template<template<typename...> class Templ, typename... A1, typename... A2> 
struct my_trait<Templ<A1...>, Templ<A2...>> 
: std::true_type 
{ }; 
+0

'decltype' on' template class U> T get_scalar (U ); 'позволит вам найти скалярные типы, если вы уже знаете скалярный/нескалярный шаблон. У нас нет «Я возьму' шаблон ', любой скалярный шаблон или' typename 'шаблон шаблона шаблона, однако. – Yakk

 Смежные вопросы

  • Нет связанных вопросов^_^