In primo luogo, lasciate che vi presenti una soluzione parziale:Come confrontare un modello di modello con un'istanza di modello?
template <template <class...> class,
typename ...>
struct is_tbase_of:
std::false_type
{ };
template <template <class...> class Type,
typename ...Args>
struct is_tbase_of<Type, Type<Args...>>:
std::true_type
{ };
Nei casi comuni, funziona:
is_tbase_of<std::vector, std::is_integral<int>>::value; // false
is_tbase_of<std::vector, std::vector<int>>::value; // true
Ma, non funziona su un modello modello «meta-ritornato», per esempio:
template <template <class ...> class T>
struct quote
{
template <typename ...U>
using type = T<U...>;
};
using QVec = quote<std::vector>;
is_tbase_of<QVec::template type, std::vector<int>>::value; // false...
ho provato un sacco di cose, cercando di ottenere il secondo argomenti tipo di modello (per confrontare il tipo di specializzazione citato), ma a quanto pare non riesco a farli lavorare. Anche la specializzazione di is_tbase_of
per quote
(che sarebbe un'opzione meno generica ma sufficiente) sembra mandarmi agli angoli neri del modello di corrispondenza dei modelli.
Clever. Tuttavia, [c'è un piccolo buco] (http://coliru.stacked-crooked.com/a/c6ef3ae1217de2c6). Molto piccolo, non vale la pena di pensarci, ma guarda quell'ultima affermazione. Divertente se gli argomenti di 'S' sono gli stessi di' S2_', 'static_assert' fallisce! – Yakk
Molto bello :-) Meno sorprendente, ma questo 'modello usando S2 = void;' fallirà sempre ... –
Alex
Penso che questo non possa generare un falso positivo, comunque. Ecco una domanda: la tua soluzione ha mai avuto una risposta diversa da [mia] (http://stackoverflow.com/a/28865203/1774667)? E se sì, chi è più corretto? (Penso che la risposta sia "no") – Yakk