小编McK*_*CPP的帖子

使用宏自动注册对象创建者功能

基本上,我想为跨多个头文件定义的一堆类自动向对象工厂注册对象创建者函数。

这篇文章的最佳答案提供了一个解决方案——但它不符合我的限制。

我正在处理现有的代码库。对于我需要注册的类,在类声明之后已经有一个宏,它将类作为参数。如果我能够扩展现有的宏定义以进行注册,那么它将节省大量时间,因为无需更改现有代码。

我能想到的最接近的解决方案是创建一个宏,该宏定义注册该对象的方法的模板特化,然后调用先前定义的模板特化方法——从而链接所有寄存器调用。然后,当我想注册所有类时,我只调用最近定义的专业化,它以#include 外观的相反顺序注册所有内容。

下面,我发布了一个简单的工作示例,显示了我迄今为止的解决方案。

唯一需要注意的是,我无法自动跟踪链中要调用的最后注册类型。所以我不断将#define LAST_CHAIN_LINK 重新定义为最近的专用类型名。这意味着我必须在每个现有的宏调用之后添加两行 #undef/#define —— 我真的很想避免这种情况。

主要问题:在下面的代码中,是否有任何方法可以定义 REGISTER_CHAIN 宏以在不使用 LAST_CHAIN_LINK #undef/#define 代码的情况下工作?

如果可以在 REGISTER_CHAIN 方法中重新定义 LAST_CHAIN_LINK 令牌就好了……

我的猜测是使用__COUNTER__预处理器功能可以实现一些解决方案,但这在目标平台之一(使用 gcc 4.2.x 的 OS X)上不可用,因此不是一个选项。

简化示例(在 GNU C++ 4.4.3 上编译):

#include <map>
#include <string>
#include <iostream>

struct Object{ virtual ~Object() {} }; // base type for all objects

// provide a simple create function to derived classes
template<class T> struct ObjectT : public Object {
  static Object* create() { return new T(); } …
Run Code Online (Sandbox Code Playgroud)

c++ macros templates

5
推荐指数
1
解决办法
9715
查看次数

在编译时通过模板自动判断类型是否为抽象基类

是否可以在编译时自动判断一个类是否是抽象基类?

我有一个对象工厂,通过其他通用代码,有时会使用抽象基类类型进行实例化。该代码无法编译,因为它在 ABC 上调用了 new T()。在这种情况下,我最终必须专门为每个 ABC 创建对象工厂代码来代替断言(0)。如果可以在编译时自动确定类型是否是 ABC,那么这种专业化就可以自动化。

一个简化的示例如下:

// this program code compiles w/ gcc 4.4
#include <iostream>
#include <typeinfo>

// How to automatically specialize this class at compile-time?
template<typename T>
struct isAbstractBaseClass
{
  enum { VALUE = 0 };
};

// Factory to create T, lives in a struct to allow default template parameters
template<typename T, int ABSTRACT = isAbstractBaseClass<T>::VALUE >
struct Create
{
  static T* create()
  {
    return new T();
  }
};

// specialize Create for …
Run Code Online (Sandbox Code Playgroud)

c++ templates

5
推荐指数
1
解决办法
1973
查看次数

标签 统计

c++ ×2

templates ×2

macros ×1