vorrei avere un modello con un valore nidificato che dovrebbe essere inizializzato da una data funzione di inizializzazione:modello Specializzarsi con puntatore a funzione, che dipende dal parametro modello
template <typename T, T(INIT)()> struct Foo
{
T value = INIT();
};
Può essere utilizzato in questo modo:
// Some random type only instanceable through factory()
struct Bar
{
int bar{};
private:
// The only way to create a Bar is through factory()
friend Bar factory();
Bar() {};
};
Bar factory() { return {}; }
Foo<Bar, factory> foo;
Ma, se è prevista alcuna funzione, il modello dovrebbe cercare di default-inizializzare il valore nidificato, così ho cercato di specializzarsi il modello:
template <typename T> struct Foo<T, nullptr>
{
T value{};
};
L'idea è quella di utilizzare in questo modo:
struct Baz{};
Foo<Bar, factory> foo; // Nested Bar have Bar::bar initialized through factory function.
Foo<Baz> baz; // No factory function needed, nested Baz default-initialized.
Ma ho appena scoperto che modello di tipi di specializzazione parziali non possono contare su altri tipi di modello, l'errore che sto ricevendo è incollato sotto:
error: type 'T (*)()' of template argument 'nullptr' depends on a template parameter template struct Foo
C'è un modo per raggiungere il mio obiettivo? Sarebbe bello se funziona con le variabili di modello così:
template <typename T, T(INIT)()> T Foo = INIT();
template <typename T> T Foo<T, nullptr>{};
domanda Extra: Perché specializzazioni parziali non possono dipendere da parametri di modello? Qual è la logica dietro questa restrizione?
Accettato questo e nessuno da @ Jarod42 perché è stato risposto 1 secondo prima! –