Если вы можете использовать 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()
, как предложил Керрек С.Б. (спасибо!).
Что вы подразумеваете под «проверкой»? Ясно, что 'b [0]' * - * такой «экземпляр» в вашем коде. –
За исключением 'Array' не имеет' operator [] '. – juanchopanza
@KerrekSB typename of b [0] - Array, имя_файла [0] - строка. Я знаю это, но как я могу проверить это с помощью кода? –