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

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

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);

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


comment
Мне нравится этот вопрос, но мне интересно узнать, какими могут быть приложения такого объекта, если это вообще возможно.   -  person Component 10    schedule 09.01.2013
comment
@ Component10, посмотрите на связанный вопрос; это позволит определить, является ли такой бросок безопасным или нет. Приведение безопасно до тех пор, пока не существует специализации константной квалификации типа параметра.   -  person lurscher    schedule 09.01.2013
comment
Понятно - я вижу, как это может быть полезно.   -  person Component 10    schedule 09.01.2013
comment
@lurscher На самом деле это было бы небезопасно, потому что класс может содержать экземпляр другого класса-шаблона, который специализирован для типов const, не так ли?   -  person Seth Carnegie    schedule 09.01.2013
comment
Я подозреваю, что проблема в том, что вы делаете относительно простые рассуждения о полном по Тьюрингу языке, не принимая во внимание его полноту по Тьюрингу. Belong_To_Same_Templ_Definition не выводит ничего полезного, учитывая, насколько мощными являются шаблоны в C++.   -  person Yakk - Adam Nevraumont    schedule 09.01.2013


Ответы (1)


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

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

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

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

person Useless    schedule 09.01.2013
comment
Итак, я все еще пытаюсь найти способ убедиться, что мой бросок безопасен... кажется, что это невозможно с использованием утверждений времени компиляции, тогда - person lurscher; 09.01.2013
comment
@lurscher Я думаю, что невозможно убедиться, что приведение безопасно для произвольного шаблона. Вам нужно будет создать новый vector и переместить/скопировать в него элементы. - person Seth Carnegie; 09.01.2013
comment
я знаю, вы, вероятно, правы, но это кажется таким расточительным, если бы только std:vector поддерживал это с помощью некоторого std::vector‹const T›& as_vector_of_consts() - person lurscher; 10.01.2013
comment
Я согласен, но я думаю, что решение состоит в том, чтобы смешать vector<T> с vector<T> const & (и соответствующими константными итераторами и т. д.) вместо vector<T> и vector<const T> - person Useless; 10.01.2013