【发布时间】:2012-04-05 12:59:25
【问题描述】:
我想请教您有关此代码的一些建议。它有效,但我认为它可以用更优雅的方式编写。这是一段 C++11 代码,所以在编译时请记住它;)!
#include <iostream>
#include <type_traits>
#include <typeinfo>
using namespace std;
class A {};
class B: public A {};
class C {};
class D: public C {};
class E: public A, public C {};
template<class T, typename = void>
class Example;
template<class T>
class Example<T, typename enable_if<is_base_of<A, T>::value and not is_base_of<C, T>::value>::type>
{
public:
string a() const
{
return string(typeid(T).name()) + " have A as base class";
}
};
template<class T>
class Example<T, typename enable_if<not is_base_of<A, T>::value and is_base_of<C, T>::value>::type>
{
public:
string b() const
{
return string(typeid(T).name()) + " have C as base class";
}
};
template<class T>
class Example<T, typename enable_if<is_base_of<A, T>::value and is_base_of<C, T>::value>::type> :
public Example<A>,
public Example<C>
{
};
int
main()
{
Example<B> example1;
Example<D> example2;
Example<E> example3;
cout << example1.a() << endl;
//cout << example1.b() << endl; It must raise a compile error
//cout << example2.a() << endl; It must raise a compile error
cout << example2.b() << endl;
cout << example3.a() << endl;
cout << example3.b() << endl;
}
如您所见,我正在尝试编写一个类模板来处理派生自A 和C 的类。问题是当 A 和 C 被继承为类 E 时。事实上,我们也可以有这样的东西......
template<class T>
class Example<T, typename enable_if<is_base_of<A, T>::value> { /* ... */ };
template<class T>
class Example<T, typename enable_if<is_base_of<C, T>::value> { /* ... */ };
...但是当一个类(如 E)继承 A 和 C 时,它会失败。
对更好的代码有什么想法吗? 谢谢
【问题讨论】:
-
不清楚你想用这个做什么。显然你不能为
Example<B>调用b(),因为它只实现a(),反之亦然Example<D>。您只需要填写缺少的方法。这些方法可以存在吗?从给定的信息中无法判断。
标签: c++ c++11 multiple-inheritance template-specialization enable-if