Dato che voglio eseguire il filtraggio su alcuni dati, come evitare di generare questi dati in fase di runtime, ma mantenere la flessibilità di modificare le dimensioni e la distribuzione dei dati di questi filtri, mantenendo anche un codice pulito e riutilizzabile. So che posso utilizzare i modelli per fare qualcosa di simile al seguente:Come si generano staticamente dati float al momento della compilazione?
template <int x> class Filter
{
static const float f;
static const Filter<x-1> next;
inline float* begin(const Filter<x>& el){ return &f; }
inline float* end(const Filter<x>& el) { return (&f)+x+1; }
};
template <> class Filter<0>
{
static const float f;
inline float* begin(const Filter<0>& el){ return &f; }
inline float* end(const Filter<0>& el) { return (&f)+1; }
};
template <int x> const float Filter<x>::f = someDistribution(x);
template <> const float Filter<0>::f = someDistribution(0);
Questo sarà davvero generare i dati in mio filtro secondo l'indice x nell'oggetto filtro secondo someDistribution (...). Tuttavia ci sono alcuni aspetti negativi per il mio utilizzo ...
1) Penso di aver ragione nel dire che mentre questi dati non vengono generati sulla costruzione dell'oggetto, vengono generati una volta all'avvio del programma. - questo potrei tollerare anche se preferirei che il filtro sia calcolato in tempo reale e cotto in quel momento (questo è possibile anche per i dati float?)
2) Il filtro non istanzia il membro "successivo" a meno che non ci sia una funzione di membro (che si chiama da qualche parte!), che attraversa la lunghezza della struttura, vale a dire
// inside template<int x> class Filter
inline void instantiate() const { next.instantiate(); };
// then inside template<> class Filter<0>
inline void instantiate() const { };
che devo fare male da richiedere la funzione di un'istanza precipitare e questo non riesce la clausola di facile manutenzione.
modifica: la ragione per cui mi interessa qui è che vorrei fare in modo che i membri next
siano istanziati in modo da poter attraversare l''array' statico utilizzando le funzioni di inizio e fine.
Quindi in primo luogo come posso risolvere il problema 2 e farla finita con la funzione instantiate, e in secondo luogo è possibile risolvere il problema 1 in modo che questi dati è generato dinamicamente in fase di compilazione e sostenuto in.
(NB I su problemi simili ho usato gli script di pre-compilazione Python per generare file sorgente contenenti i dati del filtro, ma non voglio usarli qui dato che è il proprio bollitore di pesce!)
Non penso che la tua funzione generica 'end' sia legale. Aggiungere più di 1 all'indirizzo di una variabile non matrice deve essere illegale. –
quindi questo dovrebbe essere ok dato che il 'float f' dovrebbe essere tutto contiguo in memoria permettendoti di prendere un puntatore al primo e iterare fino alla fine. È importante sottolineare che l'iteratore finale deve essere dereferenziabile ed è legale tenere un puntatore alla memoria non inizializzata. Concordo sul fatto che avrei potuto essere più chiaro scrivendo '((float *) (& f)) + x + 1', tuttavia ritengo che il significato del resto dello snippet di codice sia più chiaro con la forma breve usata sopra. Grazie per il controllo però. – geoff3jones