2012-11-24 14 views
5

Niektóre z moich klas bazowych otrzymują mnóstwo parametrów. Teraz chcę, aby określić, które statyczna funkcja używać:Używanie funkcji statycznych klasy bazowej bez określania parametrów w celu uniknięcia niejasności.

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 widać, muszę napisać parametry dwukrotnie szablon, który prowadzi do powielania kodu.

Czy istnieje sposób na pozbycie się tego?

Odpowiedz

3

Można używać 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, najczystsze rozwiązanie dla klas bez szablonów. – hpohl

+0

'używając B_SBase = SBase ' jest alternatywą C++ 11 do typedef. – damienh

0

Dokonaj B szablonu klasy. Tam nie ma 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

Jeśli B jest już szablon (który jest głównie w przypadku mojego kodu), a następnie można użyć czegoś takiego:

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

Jeśli tak nie jest, jednakże, nie ma możliwości, że jestem świadom, aby nie powtarzać klasę bazową lub zanieczyszczających nazw z typedef SBase<...> Bs_Base. Ale jeśli jesteś sprytny, musisz napisać to dwa razy:

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, najlepsze rozwiązanie dla klas szablonów. – hpohl

Powiązane problemy