Vorrei scrivere un modello che può decostruire un tipo in un modello con parametri modello non di tipo insieme ai suoi argomenti modello non di tipo. Ad esempio, decomprimerebbe e, ma funzionerebbe in modo generico per qualsiasi tipo di parametro modello non di tipo (tipi interi, puntatori, puntatori membri, ecc.).Riassunto su tipi di parametri modello non di tipo
prima prova, con il modello di specializzazione:
template<typename T> struct foo { enum { n = 1 }; };
template<int x> struct bar { enum { n = x }; };
template<typename T, template<T> class X, T x>
struct foo< X<x> > { enum { n = x }; }; // here x must be of integral type, but that's just for testing
int main(int, char**) { return foo< bar<16> >::n; }
Clang 3.1 dice:
test145.cpp:6:8: warning: class template partial specialization contains a template parameter that can not be deduced; this partial specialization will never be used
struct foo< X<x> > { enum { n = x }; };
^~~~~~~~~~~
test145.cpp:5:19: note: non-deducible template parameter 'T'
template<typename T, template<T> class X, T x>
^
1 warning generated.
secondo tentativo, con un modello di funzione:
template<typename T, T x>
struct box
{
static constexpr T value() { return x; }
};
template<typename T, template<T> class X, T x>
box<T, x> foo(X<x>);
template<int> struct asdf { };
int main(int, char**) { return decltype(foo(*(asdf<9>*)0))::value(); }
Clang dice:
test150.cpp:12:41: error: no matching function for call to 'foo'
int main(int, char**) { return decltype(foo(*(asdf<9>*)0))::value(); }
^~~
test150.cpp:8:11: note: candidate template ignored: couldn't infer template argument 'T'
box<T, x> foo(X<x>);
^
1 error generated.
GCC 4.7 dice cose simili.
Si tratta di una limitazione fondamentale?
Domanda bonus: se lo è, allora c'è un modo per gestire tutte le infinite possibilità in una quantità limitata di codice, anche se è un codice meno semplice e generico? (Diventa difficile con puntatori ad esempio: per la stessa ragione per cui non riesco a scrivere template<T>
Non credo che si potrebbe scrivere template<T*>
neanche.)
prega di non chiedere il motivo per cui sto chiedendo.
Devo dire: non capisco esattamente di cosa hai bisogno –
Credo che si potrebbe riassumere come segue: Lasciamo 'template struct A {}'.E 'possibile (e se sì, come) scrivere un template 'arg' tale che' arg > :: template_' è 'template Array',' arg > :: type' è 'int', e' arg > :: value' è '5' (e di tipo' int'), e inoltre lo rende così generico che ogni possibile argomento modello non di tipo può essere gestito in questo modo. –
reima
Questo è fondamentalmente. Grazie per averlo messo più chiaramente di quanto potrei! – glaebhoerl