簡體   English   中英

在C ++中的運行時聲明對名稱空間的引用

[英]Declaring a reference to a namespace at runtime in c++

我有一個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);
 }

這很好用,但是當我的可用名稱空間列表增加並且給定每個名稱空間提供了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);

但是,如果我理解正確,就不能將名稱空間用作變量。

有沒有更好的辦法來表述? 從結構上講,這種糟糕的風格是否存在,還有沒有更標准的方法可以解決此問題?

感謝您提供的任何見解!

您應該至少知道編譯的各個階段。 名稱在運行時根本不存在。 您現有的代碼通過為每個命名空間中的每個名稱創建指針來工作。

標准解決方案是定義一個接口

class IFooBar {
   virtual void foo() = 0;
   virtual void bar() = 0;
   // Other 7 functions.
};

這允許每個名稱空間定義一個類,而不是9個函數。

幕后的編譯器可能會創建一個“ vtable”(一個函數指針數組)來實現此接口。 這將與您現在執行的操作大致相同,但是將自動執行,並且不會出現復制粘貼錯誤。

我建議使用特征。

template<Context C>
struct context;

template<NAMESPACE_1> struct context<> {
  static foo_return_t foo(...) {
    return namespace1::foo (...);
  }
  static bar_return_t bar(...) {
    return namespace1::bar (...);
  }
};

template<NAMESPACE_2> struct context<> {
  static foo_return_t foo(...) {
    return namespace2::foo (...);
  }
  static bar_return_t bar(...) {
    return namespace2::bar (...);
  }
};

然后像這樣使用:

foo_ret_t a;
bar_ret_t b; 

if (choice == "namespace1") {
  a = context<NAMESPACE_1>::foo(...);
  b = context<NAMESPACE_1>::bar(...);
} else if (choice == "namespace1") {
  a = context<NAMESPACE_2>::foo(...);
  b = context<NAMESPACE_2>::bar(...);
}

您的問題是這些東西是在運行時評估的。

通過@MSalters擴展答案 ...

有一種設計模式可以解決這種情況。 這稱為依賴注入模式

您的類(您嘗試存儲foobar )是客戶端。

命名空間包含實現接口的類。

依賴項注入器將需要將依賴項(指向命名空間中具體類之一的指針)注入客戶端。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM