通过#define macro创建自定义类
Creating a custom class through #define macro
我试图用#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
。
相关文章:
- 如何创建从Maya(或类似程序)到虚幻引擎的自定义数据导出插件
- 自定义创建QFuture
- 从具有自定义排序的向量创建集合
- 如何在创建自定义迭代器时获得 std::p air 的第一个和第二个?
- 当我使用自定义类型创建动态数组时,即使使用字符串,它似乎也不起作用
- 创建包装升压适配器的自定义范围类
- 如何使用 C 指针的自定义删除器创建unique_ptr?
- 如何使用MSVC 2019创建和使用Qt 5.14.0自定义小工具插件
- 创建具有验证和语法突出显示的自定义 printf
- 如何为使用创建窗口创建的窗口创建自定义背景颜色
- 如何创建可重新创建的自定义要求
- 如何为自定义模板对象创建专门的函数模板
- 在自定义构造函数中的堆上创建指针
- 从函数为 std::vector 创建自定义扩展
- Qt5自定义QDialog,不使用qt创建器
- 是否有任何统一的方法可以在 c++ 中创建自定义比较器?
- 查询数据库以在 C++ 中创建自定义类集合的最佳方法
- 在 QLayout 中创建和删除自定义 QWidgets 时出现 RAM 问题
- 创建自定义向量类错误
- 我什么时候用cocos2d-x中的参数初始化自定义创建函数中的变量?