2017-01-05 1 views
2

Мой класс:Проверьте объект это экземпляр класса с шаблоном

template < typename T > 
Array<T>{}; 

(исходные данные хранятся в векторе)

У меня есть объект:

Array<string> a; 
a.add("test"); 

И у меня есть объект:

Array< Array<string> > b; 
b.add(a); 

Как c я проверяю:

  1. Является b[0] экземпляром Array (независимо от типа шаблона)?
  2. Является ли a[0] экземпляром любого типа, кроме Array?
+2

Что вы подразумеваете под «проверкой»? Ясно, что 'b [0]' * - * такой «экземпляр» в вашем коде. –

+2

За исключением 'Array' не имеет' operator [] '. – juanchopanza

+0

@KerrekSB typename of b [0] - Array , имя_файла [0] - строка. Я знаю это, но как я могу проверить это с помощью кода? –

ответ

2

Если вы можете использовать C++ 11, создавая ваши черты характера; на примере

#include <string> 
#include <vector> 
#include <iostream> 
#include <type_traits> 

template <typename T> 
struct Array 
{ 
    std::vector<T> v; 

    void add (T const t) 
    { v.push_back(t); } 
}; 

template <typename> 
struct isArray : public std::false_type 
{ }; 

template <typename T> 
struct isArray<Array<T>> : public std::true_type 
{ }; 

template <typename T> 
constexpr bool isArrayFunc (T const &) 
{ return isArray<T>::value; } 


int main() 
{ 
    Array<std::string> a; 
    Array<Array<std::string>> b; 

    a.add("test"); 
    b.add(a); 

    std::cout << isArrayFunc(a.v[0]) << std::endl; // print 0 
    std::cout << isArrayFunc(b.v[0]) << std::endl; // print 1 
} 

Если вы не можете использовать C++ 11 или более поздней версии, но только C++ 98, вы можете просто написать isArray следующим

template <typename> 
struct isArray 
{ static const bool value = false; }; 

template <typename T> 
struct isArray< Array<T> > 
{ static const bool value = true; }; 

и избегать включения type_traits

--- --- РЕДАКТИРОВАТЬ

Modified (преобразована в constexpr) isArrayFunc(), как предложил Керрек С.Б. (спасибо!).

+0

Спасибо! Он работает очень хорошо –

+1

Проверка этого во время выполнения кажется необычным. Если вы создали 'isArrayFunc' constexpr, его можно было бы использовать в метапрограммировании, и я бы ожидал, что этот вопрос станет релевантным. (Если это не для TMP, то я ожидаю, что простая перегрузка станет более полезной для того, чего хочет достичь OP). –

+0

@KerrekSB - Я подозреваю, что в метапрограммировании есть 'struct isArray', который может быть полезен но почему нет; Благодарю. – max66

-1

в C++ можно использовать

if(typeid(obj1)==typeid(ob2))//or typeid(obj1)==classname 
    cout <<"obj1 is instance of yourclassname" 

в вашем случае вы можете проверить, что с TypeID (obj1) == станд :: массив

+1

typeid находится в (standard lib) –

1

Ниже приведена более короткая версия решения, предложенная max66, которая больше не использует структуру isArray.
Он работает в версиях C++ 98 и более поздних версий.

#include <string> 
#include <vector> 
#include <iostream> 

template <typename T> 
struct Array 
{ 
    std::vector<T> v; 

    void add (T const t) 
    { v.push_back(t); } 
}; 

template <typename T> 
constexpr bool isArrayFunc (T const &) 
{ return false; } 

template <typename T> 
constexpr bool isArrayFunc (Array<T> const &) 
{ return true; } 

int main() 
{ 
    Array<std::string> a; 
    Array<Array<std::string>> b; 

    a.add("test"); 
    b.add(a); 

    std::cout << isArrayFunc(a.v[0]) << std::endl; // print 0 
    std::cout << isArrayFunc(b.v[0]) << std::endl; // print 1 
} 
Смежные вопросы