Передать шаблон класса в качестве аргумента шаблона. - PullRequest
0 голосов
/ 15 декабря 2018

Можно ли передать шаблон класса (например, 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

Здесь - ссылка на пример.

1 Ответ

0 голосов
/ 15 декабря 2018
#include <type_traits>

template <typename T, template <typename...> typename Template>
struct IsInstanceOf : std::false_type {};

template <
      template <typename...> typename Template,
      typename... TArgs>
struct IsInstanceOf<Template<TArgs...>, Template>
    : std::true_type {};

#include <vector>
static_assert(IsInstanceOf<std::vector<float>, std::vector>::value);
static_assert(!IsInstanceOf<int, std::vector>::value);
#include <string>
static_assert(!IsInstanceOf<std::string, std::vector>::value);
static_assert(IsInstanceOf<std::string, std::basic_string>::value);

int main() {}

https://wandbox.org/permlink/PTXl0KoxoJ2aFJfK

...