Есть ли способ получить или определить typeid шаблона?

У меня есть класс шаблона, который зависит от нескольких классов шаблона, например:

#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 или что-то еще), чтобы компиляция прошла успешно. Однако то, что я хочу получить, - это не тип шаблона экземпляра, а тип самого класса шаблона, чтобы различать их.

Является ли это возможным? или мне нужно использовать какой-то тип экземпляра для достижения моей цели?

Шаблон класса не является типом. Специализацией этого шаблона является тип. Вы не можете написать typeid(Foo) по той же причине, по которой вы не можете, скажем, объявить переменную типа Foo, как в Foo x;

Igor Tandetnik 25.12.2020 04:01

Подумайте об этом так: шаблон даже не существует, пока вы не создадите его экземпляр с каким-либо типом.

AndyG 25.12.2020 04:03

Я знаю, что это факт. Однако, если я использую int, я получаю "3fooiie, 3bariie", и если я использую std :: string, я получаю "3fooinst7__cxx1112basic_stringicst11_traitsicesaiceeee, 3barinst7__cxx112basic_StringIceS11HAICEEEE, 3BarinSt7__cx112BASIC_STRINGSTICERICEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE Я вижу шаблон "3FooI[PLACEHOLDER]E" в обоих случаях, и это то, что я хочу получить. Думаю, если бы было какое-то ключевое слово templateid , было бы идеально.

whitebob 25.12.2020 04:05

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

Pete Becker 25.12.2020 16:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
198
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Шаблоны не являются типами. Только типы имеют typeid.

template<template<class...>class>struct template_tag{};

это шаблон.

template_tag<_Dependencies>

это тип.

Возьмите typeid template_tag<your template>.

В стороне:

Обратите внимание, что программа, в которой вы называете тип _Dependencies, имеет неправильный формат и не требует диагностики. Пожалуйста, прекратите имитировать стандартные заголовки. Они могут называть типы вещей, которые вам не разрешены.

Никогда не называйте что-либо именем, начинающимся с _, за которым следует заглавная буква. Никогда не называйте ничего, что содержит два __s. Оба зарезервированы стандартом только для использования компиляторами и стандартными разработчиками.

Спасибо за предложение. Я просто хочу знать, есть ли спецификация или стандарт, показывающий, что стиль зарезервирован / не разрешен и должен использоваться только в STL, если только не писать для него расширения? и есть ли какая-либо специальная обработка компилятора для такого стиля кодирования? Я знаю, что в компиляторе есть __ ведущие зарезервированные макросы, но просто параметр шаблона также приведет к чему-то необычному?

whitebob 25.12.2020 04:17

Кроме того, template<template<class...>class>struct template_tag{} отличается от template<template<class>class...>struct template_tag{}, один из них является шаблоном с классом шаблона varadic в качестве зависимости, а другой — шаблоном varadic с шаблоном в качестве зависимости.

whitebob 25.12.2020 04:25

Попробуйте, прежде чем жаловаться. Стандарт C++ описывает зарезервированные имена. Библиотека std является частью реализации языка; он может делать что угодно, пока компилятор генерирует требуемое поведение, когда вы #include его. Если вы хотите узнать больше по теме, нажмите [задать вопрос].

Yakk - Adam Nevraumont 25.12.2020 07:13

Я не жалуюсь, просто хочу знать, где стандарт :) еще раз спасибо за вашу помощь. Я нашел его в N4713 2017 года. раздел 5.10.3.1 и 5.10.3.2 links_here. для всех, кому это может понадобиться.

whitebob 25.12.2020 08:40

Также ваш ответ очень полезен, большое спасибо!

whitebob 25.12.2020 08:46

Еще раз спасибо за ваш ответ! Теперь я знаю, что есть два способа получить тип, связанный с шаблоном, который распознается с помощью typeid: 1. создать его экземпляр с его зависимым типом/типами. 2. создайте класс шаблона (в вашем примере template_tag), который принимает шаблон в качестве параметра. способ, который вы предлагаете, гораздо более элегантен и хорошо подходит для моей цели!

whitebob 28.12.2020 07:10

Другие вопросы по теме