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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Cend
2 / 2 / 0
Регистрация: 25.02.2013
Сообщений: 114
#1

Реализовать подстановку кода с помощью препроцессора - C++

02.09.2016, 12:10. Просмотров 166. Ответов 1
Метки нет (Все метки)

Есть множество классов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class SomeClassName1 {
   ...
}
 
class SomeClassName2 {
   ...
}
 
...
 
class SomeClassName100 {
   ...
}
...
Для каждого нужно создать функцию со своим именем и передать указатель на нее в другую функцию:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//-------------------------------------------------------------
void* SomeClassName1_FUNC() {
    return new SomeClassName1();
}
RunFunc(SomeClassName1_FUNC, "SomeClassName1");
//-------------------------------------------------------------
void* SomeClassName2_FUNC() {
    return new SomeClassName2();
}
RunFunc(SomeClassName2_FUNC, "SomeClassName2");
//-------------------------------------------------------------
...
//-------------------------------------------------------------
void* SomeClassName100_FUNC() {
    return new SomeClassName100();
}
RunFunc(SomeClassName100_FUNC, "SomeClassName100");
//-------------------------------------------------------------
...
Можно ли это упростить до:
C++
1
2
3
4
5
RUN(SomeClassName1)
RUN(SomeClassName2)
...
RUN(SomeClassName100)
...
Сделал вот так:
C++
1
2
3
4
5
#define RUN(CLASSNAME) \
    void* CLASSNAME_FUNC() { \
        return new CLASSNAME(); \
    } \
RunFunc(CLASSNAME_FUNC, #CLASSNAME);
Но не работает. Подскажите, где ошибка?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.09.2016, 12:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Реализовать подстановку кода с помощью препроцессора (C++):

Директивы препроцессора Составить программу, использующую директивы препроцессора - C++
1) Задать константы M1,M2,...,M5 и вычислить M1+ 2M2 + 3M3 + 4M4 + 5M5 2) С помощью директив #if, #else, #elif осуществлять выбор строк...

Реализовать задачу с помощью цикла - C++
Необходимо переписать программу через цикл (for, while и тд без разницы) Очень прошу помочь. Вот код:#include <iostream> #include...

Реализовать задачу с помощью классов. - C++
Есть задача: создать таблицу № | Фамилия | Имя | Адрес | Телефон 1. По заданной фамилией определить номер телефона. 2. По адресу...

Реализовать стек с помощью массива - C++
Попытался реализовать стек с помощью массива. Но почему то ничего не происходит, так же попробовал пользоваться template<typename T>,...

Реализовать цикл с помощью оператора goto - C++
Помогите,пожалуйста, переделать текст программы через goto. Заранее спасибо. Текст программы: #include <vcl.h> #include...

C помощью чего можно реализовать оффлайн карту? - C++
Господа, подскажите, пожалуйста, с помощью чего реализовать оффлайн карту, с возможностью ставить на неё метки и маршруты?

1
hoggy
6672 / 2856 / 491
Регистрация: 15.11.2014
Сообщений: 6,369
Завершенные тесты: 1
02.09.2016, 19:10 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Cend Посмотреть сообщение
где ошибка?
ошибок две:

1.
Цитата Сообщение от Cend Посмотреть сообщение
CLASSNAME_FUNC
должно быть так:
C++
1
CLASSNAME##_FUNC
2.
фатальная ошибка:
вы в одном макросе объединили определение функций,
и исполняемый код запуска другой функции.

так делать нельзя.
возможно вы хотите что-то вроде этого:

http://rextester.com/ECBOZ94050
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// =======================================
 
#define DECL(CLASSNAME)         \
    void* CLASSNAME##_FUNC() {  \
        return new CLASSNAME;   \
    }                           
 
 
#define RUN(CLASSNAME)          \
    RunFunc(CLASSNAME##_FUNC, #CLASSNAME)
 
// =======================================
 
#include <iostream>
 
template<class T> void RunFunc(T*, const char* msg)
{
    std::cout<<"execute RunFunc for " << msg << std::endl;
}
 
 
struct some1{};
struct some2{};
 
DECL(some1)
DECL(some2)
 
 
int main()
{
    std::cout << "Hello, world!\n";
    RUN(some1);
    RUN(some2);
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2016, 19:10
Привет! Вот еще темы с ответами:

Реализовать матрицу целого типа с помощью QVector - C++
По долгу службы приходится часто иметь дело с матрицами, всегда использовал обычные динамические массивы, типа float **A; и дальше...

Как реализовать блок-схему на с++ с помощью while или do-while - C++
как реализовать такую блок-схему на с++? с помощью while или do-while?

Как управлять веб-камерой с помощью кода. - C++
Здравствуйте, как написать программу, которая будет использовать веб-камеру для съемки видео или фотографий. Знаете, что-то вроде motion...

Как реализовать проверку типа переменной с помощью try/catch? - C++
Здравствуйте! Я немножко не понял как тут, в С++ работают эти вещи. Вот мне нужно проверить переменную на значение, чтоб проверялась на int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru