Создайте черту типа is_template_instantiable в C ++ - PullRequest
0 голосов
/ 02 июня 2018

Можно ли построить черту типа в C ++, которая проверяет, является ли данный тип шаблона инстанцируемым с данными типами в качестве параметров шаблона?Если это возможно, как это можно сделать?

Например:

static_assert(is_template_instantiable_v<std::optional, int, int>);
static_assert(is_template_instantiable_v<std::vector, double>);

Первое утверждение не будет выполнено, поскольку std::optional ожидает только один параметр шаблона,Второе утверждение не завершается неудачно, std::vector может быть создан только с одним параметром шаблона, поскольку его второй параметр шаблона имеет значение по умолчанию.


Если вышеупомянутое возможно, будетможно допустить, чтобы признак типа был ложным в следующем случае (и не вызывал ошибку компиляции):

static_assert(is_template_instantiable_v<std::vector, int &>);

Поскольку экземпляр std::vector не может быть создан со ссылкой в ​​качестве типа значения.


Полагаю, первый пример может быть тиражирован, а второй - только стандартным кодом C ++.

1 Ответ

0 голосов
/ 02 июня 2018

Я предполагаю, что первое требование выполнимо с подходом, основанным на идиоме обнаружения :

namespace detail
{
    template<template<typename...> typename T, typename AlwaysVoid, typename... Ts>
    struct is_template_instantiable :
        std::false_type {};

    template<template<typename...> typename T, typename... Ts>
    struct is_template_instantiable<T, std::void_t<T<Ts...>>, Ts...> :
        std::true_type {};

    template<template<typename...> typename T, typename... Ts>
    inline constexpr auto is_template_instantiable_v =
        is_template_instantiable<T, void, Ts...>::value;
}

Затем, с:

template<typename T = void>
struct X{};

Он производит:

static_assert(detail::is_template_instantiable_v<X>);
static_assert(detail::is_template_instantiable_v<X, void>);
static_assert(!detail::is_template_instantiable_v<X, void, int>);

ПРИМЕР

Однако с этим типом черты я не могу решить вторую задачу ...

...