Доброго дня!
Есть простая фабрика классов
| Код |
void* Factory( string strClassName ) { if ( strClassName == string("int") ) return new int;
if ( strClassName == string("float") ) return new float; //another classes //....
return NULL; }
|
Вкратце смысл этого таков: из файла читается список имён классов, которые передуются как параметры в эту функцию. И далее идёт создание тех классов, которые эта фабрика может производить.
Написание такой фабрики я хочу заменить тремя макросами:
| Код | #define CLASSES_MAP_BEGIN( ) void* Factory( string strClassName ) {
#define CLASSES_MAP_ENTRY( ClassName ) if ( strClassName == string("(ClassName)") )\ return new (ClassName);
#define CLASSES_MAP_END( ) return NULL; }
|
В результате этого такая фабрика будет создаваться так:
| Код | CLASSES_MAP_BEGIN( ) CLASSES_MAP_ENTRY( int ) CLASSES_MAP_ENTRY( float ) CLASSES_MAP_ENTRY( AnotherClass ) CLASSES_MAP_ENTRY( etc ) CLASSES_MAP_END( )
|
Вот весь тестовый код:
| Код | #include <conio.h> #include <iostream> #include <string> using namespace std;
//cout<<setfill('-')<<setw(80)<<"-"<<endl;
// //void* Factory( string strClassName ) //{ // if ( strClassName == string("int") ) // return new int; // // if ( strClassName == string("float") ) // return new float; // // // return NULL; //}
#define CLASSES_MAP_BEGIN( ) void* Factory( string strClassName ) {
#define CLASSES_MAP_ENTRY( ClassName ) if ( strClassName == string("(ClassName)") )\ return new (ClassName);
#define CLASSES_MAP_END( ) return NULL; }
CLASSES_MAP_BEGIN( ) CLASSES_MAP_ENTRY( int ) CLASSES_MAP_ENTRY( float ) CLASSES_MAP_END( )
void main( ) { void *p = Factory( "int" );
if ( p == NULL ) cout << "Class does not Exists in ClassesMap" << endl; else cout << "OK";
getch( ); }
|
Он не работает, т.к. проблема в том, что макрос не подставляет переданный параметр в конструктор string("(ClassName)")
Т.е. задача сводится к такой: заставить макрос инициализировать строку вот таким вот образом:
| Код | #define INIT_STR( str, val ) (str) = string( "(val)" );
void main( ) { string str; INIT_STR( str, val ); cout << str;
getch( ); }
|
Сразу отвечу на ворос "А почему не вот так?:
| Код | INIT_STR( str, "val" );
|
--В моей ситуации так нельзя, т.к нужно по переданному параметру ещё и создавать экземпляр класса:
| Код | #define CLASSES_MAP_ENTRY( ClassName ) if ( strClassName == string("(ClassName)") )\ return new (ClassName); //<--!!!!!!!!!!!
|
У кого какие мысли ?? |