簡體   English   中英

如何在C ++中的運行時確定數據類型?

[英]How can I determine data type during runtime in C++?

我有一個從A派生的B類:

template<class T>
class A
{
    class iterator; // Defined fully

    iterator begin ()
    {
        // Returns a pointer to the first element
    }
    iterator end ()
    {   
        // Returns a pointer to the last element
    }
}
template <class T>
class B : public A
{
    // It automatically inherits the iterator
}

template <typename InputIterator>
void foo (InputIterator first,InputIterator last)
{
    // Some code to infer whether it is of type A or B
}

現在,有些函數說foo()是一次使用B::begin()調用的,而有時是通過A::begin()調用的。

我需要在運行時確定類型以推斷類型並設置一些標志變量。 我該怎么做呢? 我嘗試使用typeinfo()但它為兩個迭代器返回相同的值。

在庫type_traits中,您可以使用一些類型魔術:
is_base_of-如果Base是Derived的底數,則返回true。
is_same-如果A與B的類型相同,則返回true。
帶有type_traits的所有內容都可以在這里找到http://www.cplusplus.com/reference/type_traits/?kw=type_traits

它們不是運行時,而是結構和模板的魔力,C ++默認不支持將類型作為數據。 如果願意,可以使用Boost庫,它確實支持我所知道的類型。

UPD:
正如在該問題下提到的注釋一樣,A :: iterator與B :: iterator完全相同,因此,不查看類,它們是相同的內存塊。
因此,解決方案(也許)是創建一個稍微不同的函數,實際上取決於類:

 template <typename LeftClass, typename RightClass>
 void foo (LeftClass left, RightClass right)
 { 
     if(is_same<LeftClass, RightClass>::value)
     {

     }
 //Or that
     if(is_same<LeftClass, A>::value && is_same<RightClass, A>::value)
 }

只是別忘了與班上的這個“朋友”。

typeinfo()返回相同的值,因為A::begin()B::begin()為您提供了相同類型的值。

您應該讓B::iteratorA::iterator B::iterator繼承,或者在A::iterator有一個特殊的函數,該函數將對其容器的引用/指針返回(然后是類型A或類型B )。

暫無
暫無

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

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