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

Select a given namespace at runtime

本文关键字:命名空间 运行时 选择      更新时间:2023-10-16

>假设我有这些命名空间:

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

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

然后我希望用户在一开始告诉我他使用的是哪个版本。然后在整个程序中调用相应的命名空间。

我已经尝试using namespace取决于输入,但它不起作用,因为我需要在其他源文件的函数中调用正确的命名空间。我在想也许我可以将命名空间作为函数参数发送?或者用模板做一些聪明的事情?

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

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

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

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

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;

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

简短的回答是否定的,因为当你在编译时,在代码中的特定位置调用了哪些函数以及访问了哪些变量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; 
    }
}

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