在派生类中初始化具有依赖类型名称的基础子对象

时间:2014-10-14 01:10:26

标签: c++ c++11 typetraits

根据政策提供CA的{​​{1}}类示例代码

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 } 的基类? (或者,如果不可能,是否有解决方法?)

2 个答案:

答案 0 :(得分:2)

按照您找到基类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,并将policyis_polymorphic现在正在执行的内容封装到一个类中。

答案 1 :(得分:1)

这是一个懒惰的解决方案:

template <typename T,
          typename Base = typename std::conditional<
                              std::is_polymorphic<T>::value, A, B>::type>
struct C : Base
{
    C() : Base(5) {}
};

为您的模板C提供不同的签名会产生费用,人们可能会滥用它。