Mi chiedevo se è possibile scrivere una funzione modello che può assumere qualsiasi altro modello arbitrario come parametro e corrispondere correttamente al nome del modello (ad esempio, non solo la classe risultante). Quello che so al lavoro è questo:Argomento modello template variadic C++ che corrisponde a qualsiasi tipo di parametro
template<template<typename ...> class TemplateT, typename... TemplateP>
void f(const TemplateT<TemplateP...>& param);
che corrisponderà ad esempio per f(std::vector<int>())
o f(std::list<int>())
ma non funziona per f(std::array<int, 3>())
, come secondo parametro è un size_t
e nessun tipo.
ora penso si possa fare qualcosa di pazzo come:
template<template<typename ...> class TemplateT, size... Sizes, typename... TemplateP>
void f(const TemplateT<Sizes..., TemplateP...>& param);
Sperando che il compilatore deriverebbe correttamente sia i puntini di sospensione TemplateP
o Sizes
puntini di sospensione per essere vuoto. Ma non solo è brutto, ma funzionerà anche solo per i modelli che accettano entrambi i tipi o i parametri size_t
. Ancora non abbinerà i modelli arbitrari per esempio con i parametri bool
.
Lo stesso vale per un approccio con sovraccarico:
template<template<typename ...> class TemplateT, typename... TemplateP>
void f(const TemplateT<TemplateP...>& param);
template<template<typename ...> class TemplateT, size... Sizes>
void f(const TemplateT<Sizes...>& param);
Inoltre, tale approccio abituato' lavoro se vogliamo mescolare size_t
e typenames
. Allora, cosa sarebbe necessario per soddisfare qualsiasi cosa sarebbe qualcosa come questo, dove non ci sono vincoli a tutti per ciò che è consentito nel puntini di sospensione:
template<template<...> class TemplateT, ... Anything>
void f(const TemplateT<Anything...>& param);
Ciò sintassi non funziona, ma forse c'è altra sintassi per definire qualcosa come questo?
Questo principalmente mi chiedo che cosa è possibile nella lingua, ho pensato che potrebbe esserci effettivamente un utilizzo per esso, se si dispone di modelli diversi in cui il primo parametro è sempre fisso e si vorrebbe cambiarlo in base al tipo di ritorno e tieni tutto il resto. Qualcosa del genere:
Quindi, un modo per rendere questo lavoro in modo completamente generico utilizzando la corrispondenza dei modelli?
Questo non è puramente un esperimento mentale, come il caso d'uso per questo, dove sono rimasto bloccato era quello di creare primitive funzionali puri che operano su contenitori e sarà implicitamente costruire contenitori risultato immutabili. Se il contenitore dei risultati ha un tipo di dati diverso, è necessario conoscere il tipo su cui opera il contenitore, quindi l'unico requisito su qualsiasi contenitore è che il primo parametro del modello deve essere il tipo di input in modo che possa essere sostituito con un altro il tipo di output nel risultato, ma il codice dovrebbe essere ignaro di qualsiasi argomento del modello che verrà dopo e non dovrebbe importare se si tratti di un tipo o di un valore.
Non c'è modo di abbinare anche * un * parametro modello non di tipo se non si conosce il suo tipo. Temo che tu stia chiedendo troppe cose troppo buone. –
@ n.m. In altre parole, gli argomenti value sono argomenti template di seconda classe. (Usa un wrapper ('std :: integral_constant') per evitare gli svantaggi. (Dovrebbero aver implementato l'auto-wrapping lì ...) – Deduplicator
@nm: D'accordo, non è già possibile per i parametri 'normali'. Sono stati aggiunti parametri variadici per poter specificare più modelli generici, quindi c'è qualche speranza che qualcosa di simile sia stato aggiunto/sarà aggiunto –