2

我正在尝试使用#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 对象,我应该怎么做。现在(在“这里!!!!”行)我收到错误:

Error: Identifier "lName" is undefined

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

为了给你一些背景信息,我正在做一个自定义的多语言阅读器。因此,我可以通过执行以下操作来简单地定义新语言:

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

谢谢 !!

4

2 回答 2

5

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

#define #define LANG( cName, lName ) \
class cName \
{ \
    ...
于 2013-05-15T14:01:03.970 回答
0

我很想使用模板来解决您的问题 - 这确实是它们的用途。

不幸的是,坏消息是模板参数虽然它们可以采用大多数类型,但它们无法处理char*或根本无法处理char[]。所以:

template <char* TLang>
class
...

不幸的是,在大多数重要的用例中,C++ 是非法的,请参阅这个问题及其各自的答案。

但是,您可以使用模板来实现基于策略的设计,这是现代 C++ 设计的第一章(第二章?),并在该链接中进行了很好的描述。这个想法是你继承不同的(模板提供的)类来实现不同的“策略”。

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

cName<CppPolicy> CppName;

然后这将生成一个CppName实例,该实例是cName从 继承一些策略能力的类型类CppPolicy

如果我不得不猜测,我会说您将要根据该字符串的值来决定对给定语言执行什么操作 - 在这种情况下,基于策略的设计可能是您想要查看的内容。这具有避免if涉及字符串比较的大型语句的额外优势。

但是,如果您实际上只是在寻找字符串常量,为什么不简单地使用它们,或者按照注释中的建议将常量提供给每种语言的实例?

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

于 2013-05-15T14:18:43.720 回答