我有这样的等级:
namespace MyService{
class IBase
{
public:
virtual ~IBase(){}
protected:
IPointer *_somePointer;
};
}
class IInterface: public MyService::IBase
{
public:
virtual ~IInterface(){}
virtual std::string get() const = 0;
};
class ConcreteClass: public IInterface
{
public:
std::string get() const
{
bool isNull = (_somePointer == NULL);
return "Hello";
}
};
bool isBase = std::is_base_of<IBase, ConcreteClass>::value;
我需要检查I3是否来自I1。但是std :: is_base_of()对我来说效果不好 - 它返回false。 目标是添加到任何类IBase并检查任何类是否在其层次结构中有IBase
发现问题,但没有解决方案。我的代码是:
template<class Base, class Derived>
bool IsDerivedFromBase()
{
if( std::tr1::is_fundamental<Base>::value )
throw MyService::Exceptions::ETypeTraitsInvalidArgument( "Base class can't be POD" );
if( std::tr1::is_fundamental<Derived>::value )
throw MyService::Exceptions::ETypeTraitsInvalidArgument( "Derived class can't be POD" );
bool a = std::tr1::is_base_of<Base, Derived>::value;
return a;
}
我有这样的
bool a = std::is_base_of<MyService::IBase, SomeInterface>::value; // true
a = IsDerivedFromBase<MyService::IBase, SomeInterface>(); // false
答案 0 :(得分:4)
这确实用G ++ 4.7输出true
:
class I1{};
class I2: public I1{};
class I3: public I2{};
int main(int argc, const char* argv[])
{
std::cout << std::boolalpha
<< std::is_base_of<I1, I3>::value
<< std::endl;
return 0;
}
请注意,std::is_base_of<I1, I3>::value
等同于实例化std::is_base_of<I1, I3>
类型的对象并将其转换为bool
。
我认为这样做很准确。 std::is_base_of<Base, Derived>
被定义为具有条件(§20.9.6):
Base
是Derived
(10)的基类,不考虑cv限定符或Base
和Derived
不是联合并且名称相同的类类型而不考虑到cv-qualifiers
基类定义如此(§10):
如果类
B
是D
的直接基类或D
之一的直接基类,则类D
是类I1
的基类。基类。
是的,I3
是std::is_base_of<I1, I3>::value
的基类,true
应为{{1}}。
答案 1 :(得分:2)
#include <iostream>
#include <type_traits>
class A {};
class B : public A {};
class C : public B {};
int main() {
std::cout << std::boolalpha;
std::cout << "a2b: " << std::is_base_of<A, B>() << '\n';
std::cout << "b2a: " << std::is_base_of<B, A>() << '\n';
std::cout << "c2b: " << std::is_base_of<C, B>() << '\n';
std::cout << "a2c: " << std::is_base_of<A, C>() << '\n';
}
的产率:
a2b: true
b2a: false
c2b: false
a2c: true
上述内容适用于GCC 4.6和4.7。如果您正在使用其他东西,则需要指定它。
您的错误必须在其他地方。
答案 2 :(得分:0)
我发现了问题。 我有一些带有单元测试的.cpp文件,其中我定义了具有相同名称的本地类。 在标准时尚未找到,但再现代码类似于:
/// 1.cpp
class IInterface{};
class Interface: public IInterface{};
/// class 2.cpp
class IInterface: public MyService:IBase{};
class Interface: public IInterface{};
/// facility.h
namespace a{ namespace b{
template<class T, class B>
bool IsBaseOf(){
return std::is_base_of<T, B>();
}
}
}
}
/// ...main
a::b::IsBaseOf<MyService::IBase, Interface>();
应该/可能会失败。但如果我让类名称独一无二,那就好了。