Форум программистов, компьютерный форум CyberForum.ru

Расширение функциональности #define - C++

Восстановить пароль Регистрация
 
IvanPryamoy_2
0 / 0 / 0
Регистрация: 21.01.2013
Сообщений: 23
22.01.2013, 11:30     Расширение функциональности #define #1
Visual Studio 2012, Win7x64Prof

У меня есть код условно на 10 строк, в котором меняется 2-3 параметра. Например, создание нового класса путем наследования с добавлением public указателя (надо новое название, конструктор). Функцией всего этого не сделаешь, надо чтобы генерился "текст" кода с новыми названиями.

Итак, в коде делаю запись (сначала указываю название нового класса, а потом новый указатель):
C++
1
CLASS(ClassWithPointer, double* MyPointer);
И все это в коде разворачивается (без замены и подстановки) в нечто подобное:
C++
1
2
3
4
5
6
7
class ClassWithPointer: public BasicClass
    {
    public:
        double* MyPointer;
        ClassWithPointer (/*переменные базового класса*/):/*вызов конструктора базового класса*/{}
        ClassWithPointer(){}
    };
И теперь в коде досупна запись:
C++
1
ClassWithPointer MyPerem;
Важно, чтобы код не вставлялся: не зачем захламлять код очевидными строками. Он должен так и оставаться в сокращенной форме:
C++
1
CLASS(ClassWithPointer, double* MyPointer);
Как такое сделать?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
22.01.2013, 12:00     Расширение функциональности #define #2
Си'шное шаманство на препроцессоре? Может стоит посмотреть на шаблоны?
IvanPryamoy_2
0 / 0 / 0
Регистрация: 21.01.2013
Сообщений: 23
22.01.2013, 12:33  [ТС]     Расширение функциональности #define #3
Цитата Сообщение от Croessmah Посмотреть сообщение
Си'шное шаманство на препроцессоре? Может стоит посмотреть на шаблоны?
Шаблон вставит кусок кода.

Я добился вообще-то результата с одной заковыкой: как в параметрах #define использовать запятую, чтобы компилятор не воспринимал это как дополнительный параметр?

Например пишу так (параметра в макросе всего 4):
C++
1
#define MY_MACROS(NameClass, TypeBasic, TypePointer, NamePointer) class NameClass : public TypeBasic{public:TypePointer* NamePointer;NameClass (clong Quantity1_V, clong Quantity2_V = -1, clong Quantity3_V = -1):SmartArray(Quantity1_V, Quantity2_V, Quantity3_V){}NameClass(){}};
Дальше в коде использую так:
C++
1
MY_MACROS(cArray,  SmartArray<long,2>,  SmartArray<long, 1>,  Array2)
, но компилятор воспринимает запятые, разделяющие параметры шаблона, как делители (и считает, что параметров слишком много, о чем выдает ошибку). Как передать тип данных "SmartArray<long,2>"?

UPDATE:
Добавлено через 12 минут
Обошел небольшим извращением. Определил новые define-ы, которые внутри себя "съели" запятые:

C++
1
2
3
#define SmartArray1(Type) SmartArray<Type, 1>
#define SmartArray2(Type) SmartArray<Type, 2>
#define SmartArray3(Type) SmartArray<Type, 3>
Теперь вызов макроса изменился:
C++
1
MY_MACROS(cArray,  SmartArray2(long),  SmartArray1(long),  Array2)
В общем случае, конечно, не айс (второй параметр может принимать и миллион значений и столько define-ов не определишь), но в моем случае- подходит
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
22.01.2013, 12:39     Расширение функциональности #define #4
Как раз таки препроцессор будет вставлять код а в случае с шаблоном компилятор создаст соответствующий класс
IvanPryamoy_2
0 / 0 / 0
Регистрация: 21.01.2013
Сообщений: 23
22.01.2013, 17:16  [ТС]     Расширение функциональности #define #5
Цитата Сообщение от Croessmah Посмотреть сообщение
Как раз таки препроцессор будет вставлять код а в случае с шаблоном компилятор создаст соответствующий класс
У меня define создал класс и теперь можно удобно пользоваться этим классом (например создавать объекты и видеть поля после установки ".").

Ну а ваш подход: "тычек" правой кнопкой мыши->"вставить фрагмент" вываливает прямо в код то, что я хочу записать одной строчкой (чтобы не читать однообразный код).

Я же четко пояснил, что запись кода должна быть краткой (макросом).
Yandex
Объявления
22.01.2013, 17:16     Расширение функциональности #define
Ответ Создать тему
Опции темы

Текущее время: 21:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru