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

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

Восстановить пароль Регистрация
 
Cend
2 / 2 / 0
Регистрация: 25.02.2013
Сообщений: 100
02.09.2016, 12:10     Реализовать подстановку кода с помощью препроцессора #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);
Но не работает. Подскажите, где ошибка?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.09.2016, 12:10     Реализовать подстановку кода с помощью препроцессора
Посмотрите здесь:

C++ Как управлять веб-камерой с помощью кода.
Реализовать задачу с помощью цикла C++
C++ Реализовать задачу с помощью классов.
C++ Реализовать цикл с помощью оператора goto
C++ Реализовать аналог класса std::string с помощью vector
C++ Реализовать поиск подстрок с помощью недетерминированного конечного автомата
C помощью чего можно реализовать оффлайн карту? C++
Реализовать стек с помощью массива C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
hoggy
5114 / 2115 / 403
Регистрация: 15.11.2014
Сообщений: 4,800
Завершенные тесты: 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);
}
Yandex
Объявления
02.09.2016, 19:10     Реализовать подстановку кода с помощью препроцессора
Ответ Создать тему
Опции темы

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