给定此示例代码,其类 C
根据策略派生自 A
或 B
#include <iostream>
#include <type_traits>
struct A
{
A(int a) { std::cout << a << "\n"; }
};
struct B
{
B(int a) { std::cout << -a << "\n"; }
};
template<bool>
struct policy;
template<>
struct policy<true> { typedef A type; };
template<>
struct policy<false> { typedef B type; };
template<typename T>
struct C : public policy<std::is_polymorphic<T>::value>::type
{
C() : /* ????? */(5) {}
};
int main()
{
C<int> a; // should print -5
C<std::ostream> b; // should print 5
}
如何初始化C
的基类? (或者,如果不可能,是否有解决方法?)
最佳答案
按照找到 C
的基类的方式进行操作:
template<typename T>
struct C : public policy<std::is_polymorphic<T>::value>::type
{
C() : policy<std::is_polymorphic<T>::value>::type(5) {}
};
当然,为了使其更具可读性,您还可以添加一个typedef(也许您会在 C
内多次需要基类,那么这是值得的)。这看起来像这样:
template<typename T>
struct C : public policy<std::is_polymorphic<T>::value>::type
{
typedef typename policy<std::is_polymorphic<T>::value>::type Base;
C() : Base(5) {}
};
为了让它不那么丑陋,您还可以添加另一层间接寻址,例如模板类 BaseForC
产生正确的基数 BaseForC<T>::type
并封装了policy
和 is_polymorphic
现在正在做一节课。
关于c++ - 在派生类中初始化具有依赖类型名称的基子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26351199/