【问题标题】:Using macros to generate a class at compile time在编译时使用宏生成类
【发布时间】:2013-01-03 22:46:42
【问题描述】:

下面的类可以用宏来构造吗?

struct ModelName
{
public:
    typedef std::string type;

    static type get( const GameObject* obj )
    {
        return obj->getAttribute< type >( MODEL_NAME );
    }
};

换句话说,我想在编译时生成上面的代码给定三个参数:ModelNameMODEL_NAMEstd::string。这可能吗?

编辑:输入后,我意识到我可以使用模板实现我想要的。出于某种原因,我认为它行不通。谢谢!

【问题讨论】:

  • 您确定不想使用模板吗?
  • 如果有足够多的人告诉你,你会使用模板吗?
  • 我想还没有人提到明显的解决方案:使用模板。
  • 如果我在第一条评论中随机添加单词模板,它会被点赞吗?
  • 附注:编译时没有宏。

标签: c++ macros


【解决方案1】:

当然:

#define DEFINE_ATTRIBUTE(classname, attributeName, attributeType)   \
        struct classname                                            \
        {                                                           \
            typedef attributeType type;                             \
                                                                    \
            static type get(const GameObject* const obj)            \
            {                                                       \
                return obj->getAttribute<type>(attributeName);      \
            }                                                       \
        }

(缺少分号是正常的;它强制/允许在宏之后使用分号。)

如果可能,您可以考虑将其重新设计为模板。

【讨论】:

  • 如果我们必须使用宏,尤其是多行宏,最好将其包装在do { ... } while( 0 ) 构造中。
  • @ArunSaha:这在这里完全没有意义。除非您的目标是在自己的范围内、在一个函数内定义它们中的每一个,否则永远不会再被看到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多