0

.header如何解決,使用元編程

template<class T> 
struct type_is 
{ 
using type = T; 
}; 

template<bool, class T, class> 
struct IF_t : type_is<T> {}; 

template<class T, class F> 
struct IF_t<false, T, F> : type_is<F> {}; 

class Base1 
{ 
public: 
void print() 
{ 
    std::cout << "Base 1" << std::endl; 
} 
}; 

class Base2 
{ 
public: 
void print() 
{ 
    std::cout << "Base 2" << std::endl; 
} 
}; 

template <int q> 
class Derived : IF_t<(q > 0), Base1, Base2> 
{ 
}; 

class MultipleBaseTemplateMetaProg { 
public: 
void print() 
{ 
    Derived<1> aDerivedTrue; 
    aDerivedTrue.print(); 
    Derived<-1> aDerivedFalse; 
    aDerivedFalse.print(); 
} 
}; 

Main.cpp的

沒有成員函數「打印」在有條件的基類的情況下
MultipleBaseTemplateMetaProg aMetaProg; 
aMetaProg.print(); 

我的問題是,當我嘗試打電話打印()。我得到錯誤說打印不是一個成員函數。我不能在Derived類中使用「using」來聲明打印。

有什麼辦法可以解決這個問題嗎?除了創建一個通用的基類?

回答

5

嘗試用class Derived : public IF_t<...>::type代替class Derived : IF_t<...>Derived源自IF_t而不是Base1Base2。它也需要公開,因此您可以從Derived訪問Base1/Base2函數。

2

問題在於實現您的條件類型。它改變這種

template<bool, class T, class> 
struct IF_t : public T {}; 

template<class T, class F> 
struct IF_t<false, T, F> : public F {}; 

導致它來建立(一旦你改變所有的推導到public在下面 - 另一個錯誤,順便說一句)。

請注意,已經有std::conditional


完全建立碼:

#include <iostream> 


template<class T> 
struct type_is 
{ 
using type = T;                                               
}; 

template<bool, class T, class> 
struct IF_t : public T {}; 

template<class T, class F> 
struct IF_t<false, T, F> : public F {}; 

class Base1 
{ 
public: 
void print() 
{ 
    std::cout << "Base 1" << std::endl; 
} 
}; 

class Base2 
{ 
public: 
void print() 
{ 
    std::cout << "Base 2" << std::endl; 
} 
}; 

template <int q> 
class Derived : public IF_t<(q > 0), Base1, Base2> 
{ 
}; 

class MultipleBaseTemplateMetaProg { 
public: 
void print() 
{ 
    Derived<true> aDerivedTrue; 
    aDerivedTrue.print(); 
    Derived<false> aDerivedFalse; 
    aDerivedFalse.print(); 
} 
}; 


int main() 
{ 
MultipleBaseTemplateMetaProg aMetaProg; 
aMetaProg.print(); 
} 
+0

這導致'Derived'直接從'IF_t <...>'從'Base1'或'Base2'衍生而得。 'IF_t'應該只是一個輔助結構。 – Kevin

+0

謝謝,@Kevin - 無論如何,我認爲這裏的前三個(或這樣)類是多餘的 - 應該使用'std :: conditional'。如果不是,不能說我真的看到了使用標準庫約定(如'type')而沒有標準庫本身的區別。 –

+0

@AmiTavory感謝您的回覆!我特別提到了這一點,因爲我將使用Enum而不是Bool。因爲我將有超過2個基本類和多個專業化....如果你看到任何其他解決方法讓我知道!還有一件事,我僅限於C++ 03 – user3801185