Ho una funzione che analizza il file system dell'utente, riempie un vettore con i percorsi, quindi lo ordina o meno. Dato che l'utente dovrebbe essere in grado di decidere in fase di compilazione se desidera che il vettore sia ordinato o meno, io uso i modelli e le classi di helper al posto di un "statico se" molto desiderato (ma non esistente).Metaprogrammazione modello C++, soluzione "statica se" - può essere migliorata?
Considerate questo codice:
enum class Sort{Alphabetic, Unsorted};
template<Sort TS> struct SortHelper;
template<> struct SortHelper<Sort::Alphabetic>
{
static void sort(vector<string>& mTarget) { sort(begin(mTarget), end(mTarget)); }
};
template<> struct SortHelper<Sort::Unsorted>
{
static void sort(vector<string>&) { }
};
template<Sort TS> struct DoSomethingHelper
{
static void(vector<string>& mTarget)
{
// do something with mTarget
SortHelper<TS>::sort(mTarget);
}
};
Il codice che ho scritto sopra è molto semplificato dal the original, che prende più parametri di modello per consentire all'utente di personalizzare ulteriormente i risultati della funzione a tempo di compilazione .
Esiste un'alternativa all'utilizzo di tutte queste classi di supporto? Diventa davvero disordinato e difficile da leggere.
Idealmente, questo è quello che vorrei scrivere:
enum class Sort{Alphabetic, Unsorted};
template<Sort TS> struct DoSomethingHelper
{
static void(vector<string>& mTarget)
{
// do something with mTarget
static_if(TS == Sort::Unsorted) { /* do nothing */ }
static_if(TS == Sort::Alphabetic) { sort(begin(mTarget), end(mTarget)); }
}
};
Non esistente e [non probabile che esistano] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3613.pdf). – Morwenn
Ehm, perché ti interessa fare questo in fase di compilazione? Sembra che tu stia pensando troppo a questo. Se si esegue la scansione di un albero di directory per la prima volta, un singolo ramo di runtime sarà molto al di sotto del rumore di riferimento nell'impatto sulle prestazioni. –
Se tutti i rami sono sintatticamente e semanticamente validi, è possibile utilizzare un normale 'if' e l'ottimizzatore eliminerà i rami inattivi, così come i comandi/salti non necessari. Se i rami inattivi non vengono compilati, tuttavia, gli helper sono l'unico modo. – Angew