Как мне создать массив пространств имен?

StackOverflow https://stackoverflow.com/questions/805128

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Пространство имен, если это поможет, содержит эти переменные:

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

Так что любая помощь была бы желанна.

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

Если вы говорите о C ++, то там вы не можете передавать пространства имен как сущности.Но вы можете сделать это с помощью types в качестве аргумента типа для шаблонов.В этом случае Последовательность 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];

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top