我目前正在尝试对通用参数进行类型检查,我不知道在不重载函数和方法的情况下是否可以实现这种检查,我想避免这种可能性。我将在下面尝试解释我要做什么。
我有一个类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;
};
使用Create
和Get
静态方法,假设我已经专门化了相关的TParam
类,我可以轻松创建各种参数。
我使用了它,假设您知道输入的类型,并且应该在Algorithm
继承的类中返回,它可以工作。但是有一件事情困扰我,因为下面的代码可以编译并运行:
TypeA aobj();
GenericParameter* aobj_p = GenericParameter::Create(aobj);
TypeB bobj = GenericParameter::Get<TypeB>(aobj_p);
由于我不进行类型检查,因此可以在包装TypeB
对象的同时从GenericParameter
实例中获取TypeA
对象。我已经尝试过基于GenericParameter
类中的枚举和类型字段的类型检查解决方案,但是我想知道是否有人看到它的另一种可能性。
如果有人需要,我可以提供方法的实现。