Можно ли передать шаблон класса (например, 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
Вот ссылка на пример.
std::shared_ptr
какого-либо типа. Но потом я подумал, что могу как-то его обобщить (включить в свою библиотеку utils). - person Timo   schedule 15.12.2018