如何根据C ++中的不同值使用不同的命名空间?

时间:2017-02-27 23:17:49

标签: c++ string namespaces

例如,我有1000个不同的命名空间,它们定义如下:

namespace FirstScope {
 static const char* arrayTest[2] = {"from a1","from a 2"};
}
namespace SecondScope {
 static const char* arrayTest[12] = {"from b1","from b 2".....};
}
....... etc

每个都有一个包含字符串的数组。这些数组具有相同的名称:arrayTest 我有一个函数,它定义为(pesudo代码):

void function1(string stringValue)
{
  return stringValueScope::arrayTest[0];

}

由于我有1000个不同的命名空间,我总是需要像

一样返回
StringValueScope::arrayTest[0];

传递给function1的字符串绝对是命名空间名称的起始字符串。例如,如果stringValuetest,我们需要返回testScope::arrayTest[0]。如果我们调用类似function1("First")的function1,它将返回FirstScope::arrayTest[0] C ++中是否有可以实现的机制/方法?

1 个答案:

答案 0 :(得分:1)

不,没有办法做到这一点。 C ++对于类似反射的东西并没有太大的作用。

你必须找到一种根本不同的方法来做到这一点。例如,一些可能性(在许多中):

  • 如果您的阵列数据是由另一个程序生成的,您还可以生成一些大量的if...else来返回正确的数组(这不是一个很好的解决方案,但可以在紧要关头工作)。
  • 如果你的数组数据在编译时是已知的,而不是将所有数据作为数组存储在不同的命名空间中,则将每个数据存储在一个文本文件中,然后使用传入的字符串生成文件名并加载数据(确保首先清理输入字符串以避免安全问题,当然)。这样做的额外副作用是,如果您的数据发生变化,您不必重新编译二进制文件(另一方面,它不再是自包含的,但不确定您的方案是什么)。
  • 提前注册map<string,const char **>中的所有数组并在那里进行查找,如果生成了代码,您应该可以毫无问题地进行设置。
  • 如果以上工作都不是,您只需要将其填满并填充map或手动构建一个大if。或许可以使用基本的工厂式方法使map选项更灵活。我想如果有太多的数据来手动处理这个,你可以编写一个脚本或其他东西来解析你当前的源并生成所述map / etc.从中,并将其作为构建过程的一部分运行。

其中一些选项可能比其他选项更合适。您也可以考虑其他选项。但是,单独使用名称空间或类或变量名称无法做到这一点。

如果它激发您思考其他选项:请记住,如果数据 由另一个程序生成,您不一定需要使用名称空间,还有其他无限的方法来组织数据