在c ++中声明在运行时对命名空间的引用

Kar*_*ard 0 c++ namespaces

我有一个c ++程序,其中我:

  1. 有一个类,其中包含作为成员的函数句柄,说void (*foo)void (*bar)
  2. 拥有一组名称空间,每个名称空间定义相同名称的函数,例如:
    • namespace1包含功能void foo()void bar()
    • namespace2还包含功能void foo()void bar()

在运行时,我希望用户能够传递一个变量,比如说choice,它表示所选的命名空间.然后,类中的函数将映射到相应命名空间中的相应函数.

目前,我正在使用以下内容:

 if (choice == "namespace1") {
     my_class.foo = &(namespace1::foo);
     my_class.bar = &(namespace1::bar);
 } else if (choice == "namespace2") {
     my_class.foo = &(namespace2::foo);
     my_class.bar = &(namespace2::bar);
 }
Run Code Online (Sandbox Code Playgroud)

这很好用,但是当我的可用命名空间列表增加并且每个命名空间提供了我希望传递给类的9个函数时,它变得相当麻烦.

有什么办法可以整理一下吗?我的第一个想法是:

 if (choice == "namespace1") {
     my_namespace = namespace1;
 } else if (choice == "namespace2") {
     my_namespace = namespace2;
 }
 my_class.foo = &(my_namespace::foo);
 my_class.bar = &(my_namespace::bar);
Run Code Online (Sandbox Code Playgroud)

但是,如果我理解正确,我不能使用名称空间作为变量.

有没有更好的方法来制定这个?结构化,这是一种糟糕的风格,是否有更标准的方法来解决这个问题?

感谢您提供的任何见解!

MSa*_*ers 6

你应该知道编译的阶段,至少大约.名称在运行时根本不存在.您现有的代码通过为每个名称空间中的每个名称创建指针来工作.

标准解决方案是定义接口.

class IFooBar {
   virtual void foo() = 0;
   virtual void bar() = 0;
   // Other 7 functions.
};
Run Code Online (Sandbox Code Playgroud)

这允许每个命名​​空间定义一个类而不是9个函数.

有可能幕后的编译器创建了一个"vtable",一个函数指针数组,来实现这个接口.这与您现在大致相同,但随后自动化,没有复制粘贴错误的可能性.