Можно ли проверить, равен ли объект классу шаблона, не указывая тип шаблона?

Предположим, у меня есть класс:

template<typename T>
class ChartData {
public:
...

Теперь я хочу проверить, является ли объект value объектом ChartData:

if (value.type() == typeid(ChartData*))

Однако это вызывает ошибку

список аргументов для шаблона класса отсутствует

Таким образом, компилятор ожидает, что я поместил тип в ChartData*, однако в этом состоянии меня не интересует тип — я просто хочу знать, является ли объект экземпляром объекта ChartData.

Это возможно? Если да, то как?


person Tom    schedule 23.02.2020    source источник
comment
Не во время выполнения, нет. А как насчет базового класса для шаблона youtr?   -  person Quentin    schedule 23.02.2020
comment
Экземпляров ChartData нет нет, потому что ChartData — это не тип, а шаблон для создания типов. Экземпляры шаблона — это типы, но они настолько не связаны, как если бы вы написали их от руки.   -  person molbdnilo    schedule 23.02.2020


Ответы (2)


Что-то в этом роде:

template <typename T>
struct IsChartData : public std::false_type {};

template <typename T>
struct IsChartData<ChartData<T>> : public std::true_type {};

if (IsChartData<decltype(value)>()) {...}
person Igor Tandetnik    schedule 23.02.2020

Вы можете использовать метапрограммирование шаблонов

#include <type_traits>

template<class, template<class...> class>
struct is_specialization : std::false_type {};

template<template<class...> class temp, class... tempargs>
struct is_specialization<temp<tempargs...>, temp> : std::true_type {};

template<class>
struct dummy {};
int main () {
    dummy<int> d;
    static_assert(is_specialization<decltype (d), dummy>::value);
}

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

person n314159    schedule 23.02.2020