Здравствуйте.
Подскажите, как можно наиболее красиво изобразить следующее определение. В коде мы пишем что-то лаконичное вроде:
// some.h, псевдокод
defclass(newtype, sometype, sometext, sometypes);
Эта строка должна определить новый класс
newtype, наследованный от
sometype, хранящий указатель на строку
sometext, и хранящая в себе значению элементы типов
sometypes.
Например, код
defclass(NewClass, BaseClass, "This is new class", (int, float));
Должен привестись к такому:
сlass NewClass : public BaseClass
{
public:
NewClass(int a0, float a1)
: m_text("This is new class")
, m_arg0(a0)
, m_arg1(a1)
{
}
private:
int m_arg0;
float m_arg1;
const char* m_text;
}
Думаю, смысл ясен и задача более чем распространенная.
Какие варианты я рассмотрел:
1. Через шаблон:
// Использование
typdef NewClass MyCoolTemplate<BaseClass, "This is new class", int, float>;
Клевый вариант, но как протащить текст? Чтобы при этом не плодить новые типы в каждой единице компиляции?
2. Через макрос
#define defclass(type, base, text, ...) \
class type : public base \
{ \
public: \
type(__VA_ARGS__) {} \ // Вот тут палево, как передать __VA_ARGS__ в туплу конструктором?
boost::tuple<__VA_ARGS__> args;\
}
// Использование
defclass(NewClass, BaseClass, "my cool text", int, float);
Тоже нормальный, но там проблема в конструкторе.
3. 2-ой вариант, но через ацкий BOOST_PREPROCESSOR. Долго читал мануалы, но так и не понял, как мне эти параметры перенести куда надо...
Какие идеи есть у вас?