Classe derivata CRTP con parametro template template

Sep 08 2020

Sto progettando un'API che ha la seguente struttura e sto cercando consigli pratici di progettazione nell'ambito dei parametri CRTP template-template. Sono relativamente nuovo ai modelli in C ++, quindi sopporta la mia inesperienza.

template<typename Derived>
struct FitCRTP {
    ...
}

template<typename Derived>
class FitBase : public FitCRTP<Derived> {
    ...
}

template<typename Derived>
class Algebraic : public FitBase<Derived> {
    Algebraic(const Matrix& data) {
        ...
    }
}

template<typename Derived, template<typename> class Alg>
class Geometric : public FitBase<Derived> {
    Geometric(const Matrix& data, Alg<someparam>) {
        ...
    }
}

Algebrico e Geometrico rappresentano due classi distinte di algoritmi e da ciascuno derivano numerosi algoritmi che si escludono a vicenda. Gli algoritmi geometrici sono unici in quanto richiedono un'ipotesi iniziale prodotta da uno dei metodi algebrici: qui sta il mio problema.

Per ciascuna delle "sottoclassi" geometriche desidero creare un parametro modello che consenta di fornire un metodo algebrico mantenendo lo schema CRTP originale. Qual è il modo migliore per implementarlo? Il mio pensiero è valido per quanto riguarda la necessità di un parametro template-template?

Risposte

parktomatomi Sep 21 2020 at 11:37

Con CRTP, la classe derivata non deve essere un modello. Si eredita un'istanza di modello del tipo di base, con il tipo derivato collegato a Derived:

class Algebraic : public FitBase<Algebraic> {
    Algebraic(const Matrix& data) { }
};

Quindi, se la tua classe derivata ha un parametro del modello e vuoi fare riferimento a se stessa, collega semplicemente i parametri del modello. I parametri del modello di modello funzionano allo stesso modo.

template<template<typename> class Alg, typename someparam>
class Geometric : public FitBase<Geometric<Alg, someparam>> {
    Geometric(const Matrix& data, Alg<someparam>) { }
};

https://godbolt.org/z/qjvvK8