如何在C++中传递类(而非对象)作为参数?
在C++中模拟Delphi的类引用(class of)
Delphi里的TDemo = class of baseclass是类引用类型,用来表示派生自baseclass的类本身,可用于创建实例、调用类方法。C++没有原生的类引用语法,需要通过以下几种方式模拟:
1. 传递类的类型标识(仅用于类型识别)
如果只需要判断类的类型,可使用std::type_info和std::type_index:
#include <typeinfo> #include <typeindex> class BaseClass {}; class DerivedClass : public BaseClass {}; void ProcessClassType(const std::type_index& type) { if (type == std::type_index(typeid(BaseClass))) { // 处理BaseClass类型 } else if (type == std::type_index(typeid(DerivedClass))) { // 处理DerivedClass类型 } } // 调用示例 ProcessClassType(std::type_index(typeid(DerivedClass)));
2. 通过工厂函数传递类(支持创建实例)
这是最贴近Delphi类引用用途的方式,定义工厂函数指针来代表类,用于创建实例:
class BaseClass { public: virtual ~BaseClass() = default; // 定义工厂函数类型:返回BaseClass指针 using ClassFactory = BaseClass* (*)(); }; class DerivedClass : public BaseClass { public: // 派生类的工厂函数 static BaseClass* CreateInstance() { return new DerivedClass(); } }; // 接收工厂函数的函数 void CreateAndUse(BaseClass::ClassFactory factory) { BaseClass* obj = factory(); // 使用对象... delete obj; } // 调用示例 CreateAndUse(DerivedClass::CreateInstance);
3. 用CRTP模板统一实现类引用
通过奇异递归模板模式(CRTP),给所有派生类自动添加类引用能力:
class BaseClass { public: virtual ~BaseClass() = default; // 纯虚函数,用于创建实例 virtual BaseClass* Create() const = 0; }; // CRTP模板,为派生类提供Create实现 template<typename Derived> class ClassRef : public BaseClass { public: BaseClass* Create() const override { return new Derived(); } }; // 派生类继承ClassRef class DerivedClass : public ClassRef<DerivedClass> { // 派生类自定义内容 }; // 接收类引用对象的函数 void UseClass(const BaseClass* classRef) { BaseClass* obj = classRef->Create(); // 使用对象... delete obj; } // 调用示例 UseClass(new ClassRef<DerivedClass>());
4. 用std::function简化工厂传递
C++11及以上可用std::function包装工厂逻辑,更灵活:
#include <functional> class BaseClass { public: virtual ~BaseClass() = default; }; class DerivedClass : public BaseClass {}; void Process(std::function<BaseClass*()> factory) { BaseClass* obj = factory(); delete obj; } // 调用示例 Process([]() { return new DerivedClass(); });
内容的提问来源于stack exchange,提问作者Para
相关产品推荐
相关产品推荐

