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