метафункция шаблона для определения специализаций шаблона

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

template <typename T>
class Templ...

typedef Templ<std::string> stringInstance;
typedef Templ<double> doubleInstance;

построены из того же определения, или если они построены из разных специализаций Templ шаблон

так что в основном гипотетическая функция шаблона будет вести себя так:

template <typename T>
class Templ
{}

template <>
class Templ<std::string>
{}

template <>
class Templ<double>
{}

template <typename T1,typename T2>
class Belong_To_Same_Templ_Definition
{}

//tests
typedef Templ<std::string> stringInstance;
typedef Templ<double> doubleInstance;
typedef Templ<int> intInstance;
typedef Templ<char> charInstance;

assert( Belong_To_Same_Templ_Definition< intInstance , charInstance >::value == true);
assert( Belong_To_Same_Templ_Definition< intInstance , doubleInstance >::value == false);
assert( Belong_To_Same_Templ_Definition< stringInstance , doubleInstance >::value == false);

Возможно ли создать такую ​​метафункцию?

8

Решение

Честно говоря, кажется маловероятным (хотя я не могу окончательно исключить хитрый трюк).

Не существует первоклассной идентичности для данной специализации (за исключением аргументов типа, которые ее выбирают) для сравнения.

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

Учтите также, что это не будет работать в любом случае, в том смысле, что он не может определить, имеют ли два экземпляра совместимый макет: даже если Templ<int> а также Templ<char> создаются из одного и того же кода шаблона, без специализации, этот код может использовать классы признаков, которые являются specialied.

3

Другие решения

Других решений пока нет …