通过类型检查处理通用参数

时间:2019-05-31 15:50:11

标签: c++11

我目前正在尝试对通用参数进行类型检查,我不知道在不重载函数和方法的情况下是否可以实现这种检查,我想避免这种可能性。我将在下面尝试解释我要做什么。

我有一个类Algorithm,它被用作描述几种算法的基础。它们每个都可以具有其特定的参数作为输入和输出。我可以重载主要的Run方法,但是对于任何我需要的类型都必须这样做,因为它很快就会变成一长串列表。所以我决定尝试做这样的事情:

class Algorithm {
public:
  Algorithm();

  GenericParameter* Run(GenericParameter* input);
};

class Alg0 : public Algorithm { ... };
class Alg1 : public Algorithm { ... };
class Alg2 : public Algorithm { ... };

GenericParameter是类型专用的,并且基于两个主要类,即不可实例化的模板化TParam类。每个TParam专业化的想法都继承了GenericParameter类:

template <typename T>
class TParam {
public:
  TParam() {
    throw std::runtime_error("Cannot instanciate this object");
  }
  TParam(const T& elmt) {
    throw std::runtime_error("Cannot instanciate this object");
  }
};

class GenericParameter {
protected:
  GenericParameter();
  virtual ~GenericParameter();

  // To create a TParam<T> instance. 
  // Will fail if no specialization.
  template <typename T>
  static GenericParameter* Create(const T& elmt) {
    return new TParam<T>(elmt);
  }
  // To create a TParam<T> instance. 
  // Will fail if no specialization
  template <typename T>
  static GenericParameter* Create() {
    return new TParam<T>();
  }
  // To get the object in the TParam<T> param
  template <typename T>
  static T& Get(GenericParameter* param) {
    TParam<T>* tmp = static_cast<TParam<T>* >(param);
    return tmp->object;
  }
};

template <>
class TParam<TypeA> : public GenericParameter {
public:
  TParam<TypeA>() {};
  TParam<TypeA>(const TypeA& elmt): object(elmt) {};
  TypeA object;
};

template <>
class TParam<TypeB> : public GenericParameter {
public:
  TParam<TypeB>() {};
  TParam<TypeB>(const TypeB& elmt): object(elmt) {};
  TypeB object;
};

使用CreateGet静态方法,假设我已经专门化了相关的TParam类,我可以轻松创建各种参数。

我使用了它,假设您知道输入的类型,并且应该在Algorithm继承的类中返回,它可以工作。但是有一件事情困扰我,因为下面的代码可以编译并运行:

TypeA aobj();
GenericParameter* aobj_p = GenericParameter::Create(aobj);
TypeB bobj = GenericParameter::Get<TypeB>(aobj_p);

由于我不进行类型检查,因此可以在包装TypeB对象的同时从GenericParameter实例中获取TypeA对象。我已经尝试过基于GenericParameter类中的枚举和类型字段的类型检查解决方案,但是我想知道是否有人看到它的另一种可能性。

如果有人需要,我可以提供方法的实现。

0 个答案:

没有答案