Можно ли передать шаблон класса (например, std::vector
, а не создавать его экземпляр, например std::vector<int>
) в качестве аргумента шаблона?Я хочу написать тип, который проверяет, является ли данный тип экземпляром данного шаблона.Я знаю, что компилятор не позволяет передавать неопознанный шаблон как есть, но мне интересно, есть ли лучший обходной путь, чем тот, который я получил.
Моя реализация (обратите внимание, что я стираю TArgs
в самомвнизу):
#include <type_traits>
template <typename Instance, typename Template>
struct IsInstanceOf : std::false_type {};
template <
template <typename...> typename Instance,
template <typename...> typename Template,
typename... IArgs,
typename... TArgs>
struct IsInstanceOf<Instance<IArgs...>, Template<TArgs...>>
: std::is_same<Instance<IArgs...>, Template<IArgs...>> {};
Эта реализация работает, но я должен создать экземпляр шаблона с некоторым типом, например:
IsInstanceOf<std::vector<float>, std::vector<void>>::value
Поведение такое, как и ожидалось, но мне интересно, есть лилучше, например
IsInstanceOf<std::vector<float>, std::vector<>>::value
// since this is illegal
IsInstanceOf<std::vector<float>, std::vector>::value
Здесь - ссылка на пример.