根据政策提供C
或A
的{{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
}
的基类? (或者,如果不可能,是否有解决方法?)
答案 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
,并将policy
和is_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
提供不同的签名会产生费用,人们可能会滥用它。