簡體   English   中英

std :: is_base_of()深度

[英]std::is_base_of() depth

我有這樣的層次結構:

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

對於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):

BaseDerived (10)的基類,與cv限定詞無關,或者BaseDerived不是聯合,並且在不考慮cv-qualifier的情況下,命名相同的類類型

基類的定義如下(第10節):

一類B是一個基類的類的D ,如果它是直接基類的D或直接基類中的一個的D的基類。

所以是的, I1I3的基類,並且std::is_base_of<I1, I3>::value應該為true

不,代碼有效:

#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。 如果您正在使用其他內容,則需要指定。

您的錯誤必須在其他地方。

我找到問題了。 我有一些帶有單元測試的.cpp文件,其中我在本地定義了具有相同名稱的類。 尚未在標准tis中找到,但是重現代碼類似於:

/// 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>();

它應該/可能失敗。 但是,如果我使類名唯一,那就好了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM