检查对象是否是带模板的类的实例

时间:2017-01-05 21:17:15

标签: c++ class templates typechecking

我的课程:

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

(源数据存储在向量中)

我有一个对象:

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

我有一个对象:

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

我该如何检查:

  1. b[0]Array的实例(无论模板类型如何)?
  2. a[0]是除Array以外的任何类型的实例吗?

3 个答案:

答案 0 :(得分:3)

如果你可以使用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

---编辑---

根据Kerrek SB的建议修改(在constexpr中转换)isArrayFunc()(谢谢!)。

答案 1 :(得分:1)

以下是max66提议的解决方案的较短版本,不再使用struct 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
}

答案 2 :(得分:-1)

在c ++中你可以使用

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

在您的情况下,您可以使用typeid(obj1)== std :: array

进行检查