2012-11-24 42 views
5

我的一些基類獲取大量參數。現在我想指定要使用的靜態函數:在不指定參數的情況下使用基類的靜態函數以避免模糊

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; 
}; 

阿蘇你可以看到,我需要寫兩次模板參數導致代碼重複。

有什麼辦法擺脫它嗎?

回答

3

你可以使用一個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,非模板類最清潔的解決方案。 – hpohl

+0

'使用B_SBase = SBase damienh

0

B設爲類模板。在那裏,沒有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

若B已經是一個模板(其中大部分是在我的代碼的情況下),那麼你可以使用某事像這樣:

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

如果不是的話,但是,有沒有可能我知道的不重複的基類或者污染了typedef SBase<...> Bs_Base命名空間。但如果你很聰明,你只需要寫兩遍:

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,模板類的最佳解決方案。 – hpohl

相關問題