2012-11-24 11 views
5

Alcune delle mie classi base ottengono tonnellate di parametri. Ora voglio specificare quale funzione statica da utilizzare:Uso di funzioni statiche di una classe base senza specificare i parametri per evitare l'ambiguità

template <typename... Types> 
struct SBase { 
    static void func() { 
    } 
}; 

struct A : public SBase<int> { 
}; 

struct B : public A, public SBase<int, double, short, 
    unsigned int, float, unsigned char, long, unsigned long> { 

    // using SBase::func; // Not possible. 
    // Horrible, but works. 
    using SBase<int, double, short, 
    unsigned int, float, unsigned char, long, unsigned long>::func; 
}; 

Aso si può vedere, ho bisogno di scrivere i parametri del modello due volte che conduce alla duplicazione del codice.

C'è un modo per sbarazzarsi di esso?

risposta

3

È possibile utilizzare un typedef:

typedef SBase<int, double, short, unsigned int, float, unsigned char, 
     long, unsigned long> B_SBase; 

struct B : public A, public B_SBase { 
    using B_SBase::func; 
}; 
+0

IMO, soluzione più pulita per classi non modello. – hpohl

+0

'using B_SBase = SBase ' è un'alternativa C++ 11 a typedef. – damienh

0

Marca B un modello di classe. Lì, non repetetetitions:

template<typename... Types> 
struct B : public A, public SBase<Types...> { 
    using SBase<Types...>::func; 
}; 

typedef B<int, double, short, unsigned int, float, unsigned char, long, unsigned long> BB; 

void foo() 
{ 
    BB::func(); 
} 
1

Se B è già un modello (che è per lo più il caso nel mio codice), allora si potrebbe utilizzare sth in questo modo:

template <typename MyBase = SBase<int, double, short, 
            unsigned int, float, unsigned char, 
            long, unsigned long> > 
struct B : public A, public MyBase { 
    using MyBase::func; 
}; 

Se non lo è, tuttavia, non v'è alcuna possibilità sono consapevole di non ripetere la classe di base o inquinanti lo spazio dei nomi con un typedef SBase<...> Bs_Base. Ma se sei intelligente, devi solo scrivere due volte:

struct B : public A, public SBase<int, double, short, 
    unsigned int, float, unsigned char, long, unsigned long> { 
    typedef SBase<int, double, short, unsigned int, float, 
       unsigned char, long, unsigned long> MyBase; 
}; 
static_assert(std::is_base_of<B::MyBase, B>::value, ""); 
+0

+1, la soluzione migliore per le classi di modelli. – hpohl

Problemi correlati