通过#define macro创建自定义类

Creating a custom class through #define macro

本文关键字:自定义 创建 macro #define 通过      更新时间:2023-10-16

我试图用#define创建一个宏,这将允许我根据需要创建新的类。下面是我的代码:

#pragma once
#include "PDDefFileReader.h"
#define SET_LANG( lang ) *( new std::string( lang ) ) 
#define LANG( cName, lName )
class cName
{
public:
    cName()
    {
        _langName = SET_LANG( lName );                 <- HERE !!!!
        _reader = new PDDefFileReader( _langName );
    }
    ~cName(){}
    std::string Str(){ return _langName; }
private:
    PDDefFileReader* _reader;
    std::string _langName;
};

所以我想知道如果我想把定义的"lName"形参作为std::string对象,我应该怎么做。现在(在"HERE !!!!"行)我得到了错误:

Error: Identifier "lName" is undefined

你知道我想做的是否可行吗?

给你一些背景,我正在做一个自定义的多语言阅读器。所以我可以简单地定义新的语言,像这样:

LANG( Cpp, "cpp" )
LANG( Perl, "pl" )

谢谢! !

宏是空的,默认情况下它不会继续到下一行,除非你在最后使用,例如

#define #define LANG( cName, lName ) 
class cName 
{ 
    ...

我很想用模板来解决你的问题——这就是模板的作用。

不幸的是,坏消息是模板形参虽然可以接受大多数类型,但根本不能处理char*char[]。所以:

template <char* TLang>
class
...
不幸的是,在大多数重要的用例中,

是非法的c++,请参阅此问题及其相应的答案。

然而,你可以使用模板来实现基于策略的设计,这是现代c++设计的第一章(第二章?),在那个链接中有很好的描述。其思想是,您继承不同的(模板提供的)类来实现不同的"策略"。

这将达到与您的目标相同的效果。模板是在编译时为每个实例化的值生成的,所以如果我有一个类:

cName<CppPolicy> CppName;

那么这将生成一个CppName实例,它是一个类型为cName的类,它继承了CppPolicy的一些策略功能。

如果要我猜的话,我会说你要根据字符串的值来决定对一种给定的语言做什么——在这种情况下,基于策略的设计可能是你想要研究的。这有一个额外的好处,可以避免涉及字符串比较的大型if语句。

然而,如果你只是在寻找字符串常量,为什么不直接使用它们,或者像注释中建议的那样为每种语言的实例提供常量呢?

实际上,在同一个模块中两次使用LANG将产生编译错误,因为您将有两个类称为cName