У меня есть класс шаблона, который зависит от нескольких классов шаблона, например:
#include <vector>
#include <string>
#include <typeinfo>
#include <iostream>
template <typename _T>
struct Foo {
_T mem;
};
template <typename _T>
struct Bar {
_T mem;
};
template <template <typename> typename ... _Dependencies>
struct Target {
static std::vector<std::string> getSignature() {
std::vector<std::string> vec{typeid(_Dependencies<int>).name()...};
return vec;
};
};
int main () {
for (auto& item : Target<Foo, Bar>::getSignature()) {
std::cout << item << std::endl;
};
return 0;
}
обратите внимание на эту строку:
std::vector<std::string> vec{typeid(_Dependencies<int>).name()...};
Здесь я должен указать шаблону определенный тип (например, int, std::string или что-то еще), чтобы компиляция прошла успешно. Однако то, что я хочу получить, - это не тип шаблона экземпляра, а тип самого класса шаблона, чтобы различать их.
Является ли это возможным? или мне нужно использовать какой-то тип экземпляра для достижения моей цели?
Подумайте об этом так: шаблон даже не существует, пока вы не создадите его экземпляр с каким-либо типом.
Я знаю, что это факт. Однако, если я использую int, я получаю "3fooiie, 3bariie", и если я использую std :: string, я получаю "3fooinst7__cxx1112basic_stringicst11_traitsicesaiceeee, 3barinst7__cxx112basic_StringIceS11HAICEEEE, 3BarinSt7__cx112BASIC_STRINGSTICERICEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE Я вижу шаблон "3FooI[PLACEHOLDER]E" в обоих случаях, и это то, что я хочу получить. Думаю, если бы было какое-то ключевое слово templateid , было бы идеально.
Это не решает вопрос, но имена, начинающиеся со знака подчеркивания, за которым следует заглавная буква (_T, _Dependencies), и имена, содержащие два последовательных знака подчеркивания, зарезервированы для использования реализацией. Не используйте их в своем коде.





Шаблоны не являются типами. Только типы имеют typeid.
template<template<class...>class>struct template_tag{};
это шаблон.
template_tag<_Dependencies>
это тип.
Возьмите typeid template_tag<your template>.
Обратите внимание, что программа, в которой вы называете тип _Dependencies, имеет неправильный формат и не требует диагностики. Пожалуйста, прекратите имитировать стандартные заголовки. Они могут называть типы вещей, которые вам не разрешены.
Никогда не называйте что-либо именем, начинающимся с _, за которым следует заглавная буква. Никогда не называйте ничего, что содержит два __s. Оба зарезервированы стандартом только для использования компиляторами и стандартными разработчиками.
Спасибо за предложение. Я просто хочу знать, есть ли спецификация или стандарт, показывающий, что стиль зарезервирован / не разрешен и должен использоваться только в STL, если только не писать для него расширения? и есть ли какая-либо специальная обработка компилятора для такого стиля кодирования? Я знаю, что в компиляторе есть __ ведущие зарезервированные макросы, но просто параметр шаблона также приведет к чему-то необычному?
Кроме того, template<template<class...>class>struct template_tag{} отличается от template<template<class>class...>struct template_tag{}, один из них является шаблоном с классом шаблона varadic в качестве зависимости, а другой — шаблоном varadic с шаблоном в качестве зависимости.
Попробуйте, прежде чем жаловаться. Стандарт C++ описывает зарезервированные имена. Библиотека std является частью реализации языка; он может делать что угодно, пока компилятор генерирует требуемое поведение, когда вы #include его. Если вы хотите узнать больше по теме, нажмите [задать вопрос].
Я не жалуюсь, просто хочу знать, где стандарт :) еще раз спасибо за вашу помощь. Я нашел его в N4713 2017 года. раздел 5.10.3.1 и 5.10.3.2 links_here. для всех, кому это может понадобиться.
Также ваш ответ очень полезен, большое спасибо!
Еще раз спасибо за ваш ответ! Теперь я знаю, что есть два способа получить тип, связанный с шаблоном, который распознается с помощью typeid: 1. создать его экземпляр с его зависимым типом/типами. 2. создайте класс шаблона (в вашем примере template_tag), который принимает шаблон в качестве параметра. способ, который вы предлагаете, гораздо более элегантен и хорошо подходит для моей цели!
Шаблон класса не является типом. Специализацией этого шаблона является тип. Вы не можете написать
typeid(Foo)по той же причине, по которой вы не можете, скажем, объявить переменную типаFoo, как вFoo x;