如何解决,在使用元编程的条件基类的情况下没有成员函数"print"



.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();
}
};

主.cpp

 MultipleBaseTemplateMetaProg aMetaProg;
 aMetaProg.print();

我的问题是,当我尝试调用 print() 时。我收到错误,说打印不是成员函数。我不能在派生类中使用"using"来声明打印。

有没有办法解决这个问题?除了创建公共基类?

尝试将class Derived : IF_t<...>替换为 class Derived : public IF_t<...>::typeDerived是从IF_t派生出来的,而不是Base1Base2。它还必须是公开的,以便您可以从Derived访问Base1/Base2函数。

问题在于条件类型的实现。将其更改为此

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

最新更新