【问题标题】:How do I create an array of namespaces?如何创建命名空间数组?
【发布时间】:2009-04-30 02:26:07
【问题描述】:

如何创建命名空间数组?又因为这似乎是一个很长的尝试,如果这不可能,有没有类似命名空间的东西可以做成数组?

命名空间(如果有帮助的话)包含以下变量:

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

所以欢迎任何帮助。

【问题讨论】:

  • 你说的是什么语言?

标签: arrays namespaces


【解决方案1】:

你可以使用反射,但我认为你应该重新考虑你的设计。

【讨论】:

    【解决方案2】:

    我不确定您在说什么语言,但在许多(大多数?)语言中,对常量的引用在编译时被常量值替换。因此它们在运行时不再存在,甚至反射也无济于事。

    您可以在每个命名空间中创建一个类,将常量公开为(静态)属性。然后你可以使用反射在每个命名空间中搜索类,并从属性中获取常量值。

    但是,正如其他人所提到的,您真的应该重新考虑您的设计。最后,命名空间通常不能通过反射访问,因为它们只是扩展了包含的类(和其他东西)的类名。或者是否有一种(非深奥的)语言通过反射将命名空间暴露为实体?

    对于 .NET,System.Type.Namespace property 的参考说明如下。

    命名空间是一种逻辑设计时命名便利,主要用于定义应用程序中的范围,并在单个层次结构中组织类和其他类型。 从运行时的角度来看,没有命名空间。

    【讨论】:

    • 感谢您的帮助。我想我会采用最一致的想法来重新思考我的设计:)。
    【解决方案3】:

    这应该是 C++ 吗?听起来您需要定义一个类,而不是命名空间,然后创建该类的实例(对象)并将 它们 放入一个数组中。

    所以sector 变量变得很棘手,因为它的大小是基于将传递给类的构造函数的maxxmaxy 参数的值。您可以改用container classdynamically-allocated multi-dimensional array 来解决这个问题。

    【讨论】:

      【解决方案4】:

      如果你谈论 C++,你不能在其中将命名空间作为实体传递。但是您可以使用类型来执行此操作,作为模板的类型参数。在这种情况下,MPL sequence 可以与MPL algorithms 一起提供帮助:

      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];
      

      请注意,在该类型向量中的搜索发生在编译时。所以数组的值也是在编译时确定的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-04
        • 1970-01-01
        • 2012-06-26
        • 2019-12-26
        • 2015-04-05
        • 2023-03-14
        • 1970-01-01
        • 2022-07-10
        相关资源
        最近更新 更多