Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перечисление extern констант в namespace, Автоматизировать перебор значений 
:(
    Опции темы
EgoBrain
Дата 17.5.2017, 06:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: нет
Всего: 2



Приветсвую как ответ по теме так и отзыв об адекватности самой задачи или её постановке.
В общем имеется некая библиотека, в которой реализовано пространство имен, только лишь для перечисления констант до кучи еще и внешних (extern).
Напрашивается enum, но значения в перечислении - целые числа а здесь структура...
Пример:
Код

//--File FirstLevelSecondLevelNamespace.h--
#pragma once
#include "MyGlobalLib.h"

namespace FirstLevelNamespace
{
  namespace SecondLevelNamespace
  {
     struct Strct
     {
        int x;
        int y;
        int z;
     };

     extern const Strct One = {1, 1, 1};
     extern const Strct Two = {2, 2, 2};
     ...
     extern const Strct N = {n, n, n};
  };
}; 

Использование стандартное: обращение к константам из модулей, в которых включен FirstLevelSecondLevelNamespace.h
Код

#include <stdio.h>

using namespace std;
using namespace FirstLevelNamespace;

int main ()
{
   cout<<SecondLevelNamespace::One<<endl;
   cout<<SecondLevelNamespace::Two<<endl;
   ...
   cout<<"Не хочу заниматься анони..."<<endl;

   return 0;
}


Вопрос: возможно ли как нибудь автоматизировать (на уровне компилятора или препроцессора, и сгенерировать код спомощью IDE) процесс перебора констант пространства имен?

Это сообщение отредактировал(а) EgoBrain - 17.5.2017, 07:06
PM MAIL ICQ Skype   Вверх
xvr
Дата 18.5.2017, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Можно как то так:
Код

#define LIST \
Item(One, 1, 1, 1) \
Item(Two, 2, 2, 2) \
Item(N, n, n, n)

#define Item(name, v1, v2, v3) extern const Strct name = {v1, v2, v3);
LIST
#undef Item

....

main()
..
#define Item(name, ...) cout << SecondLevelNamespace::name<<endl;
LIST
#undef Item
...




Это сообщение отредактировал(а) xvr - 18.5.2017, 12:15
PM MAIL   Вверх
borisbn
Дата 23.5.2017, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Если 1) можно менять h-ник и 2) Экземпляры Strct создаются только там, то можно так:
Код

 struct Strct
     {
        int x;
        int y;
        int z;
        Strct( int x, int y, int z ) : x( x ), y( y ), z( z ) {
            m_list.push_back( *this );
        }
        Strct( const Strct & o ) : x( o.x ), y( o.y ), z( o.z ) {}
        static std::vector< Strct > m_list;
     };
static std::vector< Strct > Strct::m_list;

...
for ( auto val: SecondLevelNamespace::Strct::m_list ) cout << val;


не проверял. Могут быть ошибки.

Это сообщение отредактировал(а) borisbn - 23.5.2017, 19:29


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1160 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.