2

Рассмотрим булева трюка, чтобы проверить, если куча типов все тот же тип:Bool трюк и шаблонные параметры шаблона

template<typename Type, typename... Types> 
static constexpr bool allOf = std::is_same< 
    std::integer_sequence<bool, true, std::is_same<Type, Types>::value...>, 
    std::integer_sequence<bool, std::is_same<Type, Types>::value..., true> 
>::value; 

В качестве примера, можно использовать его как следует проверить, что все параметры является int значения:

template<typename... Args> 
void f(Args&&... args) { 
    static_assert(allOf<int, Args...>, "!"); 
    // ... 
} 

есть ли способ, чтобы использовать его со специализациями данного параметра шаблона шаблона?
В качестве примера, со следующим кодом:

template<typename> struct S {}; 

template<typename... Args> 
void f(Args&&... args) { 
    static_assert(allOf<S, Args...>, "!"); 
    // ... 
} 

Переменная allOf должна быть определена как:

template<template<typename> class Type, typename... Types> 
static constexpr bool allOf = ???; 

И я хотел бы, чтобы проверить, что каждый T в Types является конкретизацией формы S<U>, независимо от того, что такое U.

Возможно ли это?

+2

что BOOL трюк приятно, кто придумал это? –

+0

@ JohannesSchaub-litb Я не помню, где я его нашел, он был здесь, на SO так или иначе. Версия, с которой я столкнулась, была создана с использованием структур: std :: условный, std :: true_type и std: .false_type. Я начал использовать этот, когда обнаружил переменные шаблоны, более компактные, чем оригинальные. – skypjack

+0

хороший трюк, в любом случае – max66

ответ

1

Как насчет следующего?

template <typename> 
struct S 
{ }; 

template <template <typename> class, typename> 
struct isS 
{ static constexpr bool value { false } ; }; 

template <template <typename> class S, typename U> 
struct isS<S, S<U>> 
{ static constexpr bool value { true } ; }; 

template<template<typename> class Type, typename... Types> 
static constexpr bool allOf = std::is_same< 
    std::integer_sequence<bool, true, isS<Type, Types>::value...>, 
    std::integer_sequence<bool, isS<Type, Types>::value..., true> 
>::value; 
+0

Он выглядит хорошо.Я не знаю, почему это не пришло мне в голову. Я не должен создавать вопросы ночью и дважды думать о проблемах сразу же после утра. : -D +1 для этого рабочего решения, давайте посмотрим, если что-то еще придумает, прежде чем принять его. – skypjack

+1

@skypjack - это не придумало только потому, что полночь; и в полночь я в моих силах :-) – max66

+0

Существует возможное объяснение: у вас нет сына. Вы? :-D – skypjack

5

Нам просто нужно проверить для специализации:

template <class T, template <class...> class Z> 
struct isZ : std::false_type { }; 

template <class... Args, template <class...> class Z> 
struct isZ<Z<Args...>, Z> : std::true_type { }; 

И более общий реализации allOf:

template <bool... bs> 
using allOf = std::is_same< 
    std::integer_sequence<bool, true, bs...>, 
    std::integer_sequence<bool, bs..., true>>; 

С этим:

static_assert(allOf<isZ<decay_t<Args>, S>::value...>::value, "!"); 
Смежные вопросы