在运行时选择给定的名称空间

时间:2019-04-09 11:02:38

标签: c++ namespaces

说我有这些命名空间:

namespace old
{
std::array<std::string,1> characters {"old"};
}


namespace young 
{
std::array<std::string,1> characters {"young"};
}

然后我希望用户在开始时告诉我他正在使用哪个版本。然后在整个程序中调用适当的名称空间。

我根据输入尝试了using namespace,但是它不起作用,因为我需要在其他源文件上的函数中调用正确的名称空间。我在想也许可以将名称空间作为函数参数发送吗?还是对模板做些聪明的事情?

编辑: 当我提到“用户”时,是指正在使用我的可执行文件的人,一个正在玩我的游戏的人。 我要问的是问他要使用的版本,例如美国版本(事物有一些名称)或英国版本(事物有其他名称)。

所有更改就是我使用的名称。但是我希望他每次都能在版本之间切换。

我希望很清楚,如果您需要进一步说明,请告诉我。

2 个答案:

答案 0 :(得分:1)

无法将名称空间作为函数参数或模板参数传递。用户可以将其用作:

using namespace old;

characters[0] = 'O';

或代码为:

old::characters[0] = 'O';

更新:更新原始问题后

命名空间在编译期间是相关的,并且不反映运行时的任何行为。您所需要的更多是:

enum Language
{
    ENGLISH_UK, ENGLISH_US
};

std::array<std::string, 2> label = {
    "colour", // for British-english
    "color"   // for US-English
};

然后在代码中:

static Language lang = ENGLISH_UK;

std::cout << label[lang] << std::endl;

因此,如果用户界面发生了变化,则无需重新编译整个应用程序。

答案 1 :(得分:0)

简短的答案是否定的,因为例如当您在代码中的特定位置调用了哪些函数以及访问了哪些变量。写characters在编译时被清除。

稍长一点的答案是,您可以在单独的命名空间中创建包装函数和引用,并根据用户(只要类型相同)将它们转发给一个或另一个。

例如

namespace current {
    int namespace_to_use = 1; // can be set by some initialization function in your code

    std::array<std::string,1>& get_characters(){
       return namespace_to_use == 0 ? old::characters : young::characters; 
    }
}

我不会称其为良好的应用程序设计,并且有许多高级/更好的版本(例如,基于动态多态性和工厂模式或指针/引用)。最合适的选择取决于您的需求和您的经验水平。