Как мне создать массив пространств имен? - PullRequest
0 голосов
/ 30 апреля 2009

Как я могу создать массив пространств имен? И поскольку это кажется длинным выстрелом, если это невозможно, существует ли что-то похожее на пространство имен, которое можно превратить в массив?

Пространство имен, если оно помогает, содержит следующие переменные:

const int maxx=// depends on the particular namespace
               // I need an array to go through each namespace and
               // pick out the variable
const int maxy=// depends on particular namespace
//prgm is a class I made
prgm sector[maxx][maxy];
// another array of prgms.  int is my shorthand of saying "depends on
// particular namespace", so is char.
prgm programs[int]={prgm1(int,int,char),prgm2(int,int,char)...

Так что любая помощь будет приветствоваться.

Ответы [ 4 ]

2 голосов
/ 30 апреля 2009

Вы могли бы использовать отражение, но я думаю, что вы должны переосмыслить свой дизайн.

0 голосов
/ 30 апреля 2009

Если вы говорите о C ++, вы не можете передавать пространства имен как сущности. Но вы можете сделать это с типами, как аргумент типа для шаблонов. В этом случае последовательность MPL может помочь вместе с алгоритмами MPL :

struct c1 { typedef int_<2> value_x; }; 
struct c2 { typedef int_<3> value_x; };
struct c3 { typedef int_<1> value_x; };
template<typename C> struct get_x : C::value_x { };

typedef vector<c1, c2, c3> scope_vec;

typedef max_element<
    transform_view< scope_vec , get_x<_1> >
    >::type iter;

Затем вы можете создать свой массив как

prgm programs[deref< iter >::type::value];

Обратите внимание, что поиск в этом типе-векторе происходит во время компиляции. Таким образом, значение массива определяется во время компиляции.

0 голосов
/ 30 апреля 2009

Это должен быть C ++? Похоже, вам нужно определить класс, а не пространство имен, затем создать экземпляры (объекты) этого класса и поместить их в массив.

Таким образом, переменная sector становится хитрой, поскольку ее размер определяется на основе значений параметров maxx и maxy, которые будут переданы конструктору класса. Вы можете решить эту проблему, используя контейнерный класс или динамически размещенный многомерный массив .

0 голосов
/ 30 апреля 2009

Я не уверен, на каком языке вы говорите, но во многих (большинстве?) Языках ссылки на константы заменяются константным значением во время компиляции. Поэтому они больше не присутствуют во время выполнения, и даже отражение не поможет.

Вы можете создать класс в каждом пространстве имен, который представляет константы как (статические) свойства. Затем вы можете использовать отражение для поиска класса в каждом пространстве имен и получения значений констант из свойств.

Но, как уже упоминали другие, вы должны действительно переосмыслить свой дизайн. Наконец, пространства имен обычно недоступны с помощью отражения, поскольку они просто расширяют имена классов содержащихся классов (и других вещей). Или есть (неэзотерический) язык, который выставляет пространства имен как сущности посредством отражения?

Для .NET ссылка для свойства System.Type.Namespace гласит следующее.

Пространство имен - это логическое удобство именования во время разработки , используемое в основном для определения области действия в приложении и организации классов и других типов в единую иерархическую структуру. С точки зрения среды выполнения пространства имен отсутствуют.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...