Как мне создать массив пространств имен?
-
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 выполняется во время компиляции.Таким образом, значение массива также определяется во время компиляции.