Можно ли проверить, равен ли объект классу шаблона, не указав тип шаблона? - PullRequest
0 голосов
/ 23 февраля 2020

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

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

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

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

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

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

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

Возможно ли это? Если да, то как?

Ответы [ 2 ]

1 голос
/ 23 февраля 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);
}

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

1 голос
/ 23 февраля 2020

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

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

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

if (IsChartData<decltype(value)>()) {...}
...