.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<...>::type
。 Derived
是从IF_t
派生出来的,而不是Base1
或Base2
。它还必须是公开的,以便您可以从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();
}