在运行时选择给定的命名空间
Select a given namespace at runtime
>假设我有这些命名空间:
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;
}
}
我不会称之为好的应用程序设计,并且还有许多更高级/更好的版本(例如,基于动态多态性和工厂模式或指针/引用(。什么最适合您的需求和您的经验水平。
相关文章:
- 使用命名空间时出现多个定义错误
- 我该怎么做才能摆脱使用命名空间时的语法错误?
- 在 C++ 中使用命名空间时出现"does not name a type"错误
- 为什么 std::variant 找不到运算符<() 当与比较类不在同一命名空间中时
- 如何在运行时创建和命名对象?
- C++ 使用命名空间时,模板函数无法使用 g++ 进行编译
- 在 c++ 中在运行时声明对命名空间的引用
- 在 c++ 中定义命名空间中模板类的友元函数时出现问题
- 扩展命名空间 std 以在使用 C++11 时实现make_unique
- 在命名空间内的类中使用带有运算符重载的字符串流时"no match for ‘operator>>’"
- 使用命名空间 std 时C++ "Reference to overloaded function"错误
- 在运行时选择给定的命名空间
- 代码使用命名空间运行,但不使用 std::cout 运行
- 使用特殊命名空间名称时出现Arduino链接器错误
- 当一个定义位于命名空间中时不明确的函数调用
- 内联命名空间函数时出错
- std::isgraph 在使用“使用命名空间 std”时是模棱两可的
- 为什么不使用命名空间STD和使用命名空间STD时宏的行为不同?
- 当内联命名空间存在时,如何显式引用封闭命名空间?
- 为什么在使用命名空间指令时没有为函数添加命名空间