我们有一个方法,它将一个类作为参数传递。这个类有不同的子类。我们需要知道哪些类是作为此方法的参数传递的类。由于赋值要求,我们无法为每个可能的类定义一个方法。此外,如果此方法不支持子类,则必须在编译时抛出错误。 我们一直在尝试使用static_cast来实现这一点,但我们无法获得所需的结果,因为始终可以在两个子类之间进行转换。
class A{
...
};
class B : public A{
...
};
class C : public A{
...
}
void foo(A a){
if(a is B){
//OK and do stuff
}else if(a is C){
//throw compile error
}
}
答案 0 :(得分:1)
您可以将foo
本身作为模板编写,以便在编译时执行所有检查:
#include <type_traits>
template<class T>
void foo(T t)
{
static_assert(std::is_same<T, C>::value == false,
"foo() must not be invoked with object of class C");
if (std::is_same<T, B>::value) {
// do stuff
}
}
static_assert
用于某些条件的编译时检查,std::is_same
在编译时比较两种类型。