Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Перечисление extern констант в namespace


Автор: EgoBrain 17.5.2017, 06:54
Приветсвую как ответ по теме так и отзыв об адекватности самой задачи или её постановке.
В общем имеется некая библиотека, в которой реализовано пространство имен, только лишь для перечисления констант до кучи еще и внешних (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) процесс перебора констант пространства имен?

Автор: xvr 18.5.2017, 12:14
Можно как то так:
Код

#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
...



Автор: borisbn 23.5.2017, 19:26
Если 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;


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)