2012-11-24 8 views
5

Einige meiner Basisklassen erhalten viele Parameter. Jetzt will ich die statische Funktion festlegen,:Verwenden von statischen Funktionen einer Basisklasse ohne Angabe von Parametern zur Vermeidung von Mehrdeutigkeiten

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 Sie sehen, ich brauche die Template-Parameter zweimal die Vervielfältigung zu codieren führt zu schreiben.

Gibt es eine Möglichkeit, es loszuwerden?

Antwort

3

Sie ein typedef verwenden:

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, sauberste Lösung für Nicht-Template-Klassen. – hpohl

+0

'mit B_SBase = SBase ' ist eine C++ 11-Alternative zu typedef. – damienh

0

Machen Sie B eine Klassenvorlage. Es sind keine 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

Wenn B bereits eine Vorlage (die meistens in meinem Code der Fall ist), dann könnte man etw wie folgt verwenden:

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

Wenn es nicht ist, gibt es jedoch keine Möglichkeit, ich bin mir dessen bewusst nicht die Basisklasse oder Verschmutzung der Namespace mit einem typedef SBase<...> Bs_Base zu wiederholen. Aber wenn Sie schlau sind, müssen Sie es einfach zweimal schreiben:

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, beste Lösung für Vorlagenklassen. – hpohl