[英]Declaring a reference to a namespace at runtime in c++
我有一個C ++程序,其中:
void (*foo)
和void (*bar)
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擴展答案 ...
有一種設計模式可以解決這種情況。 這稱為依賴注入模式 。
您的類(您嘗試存儲foo
和bar
)是客戶端。
命名空間包含實現接口的類。
依賴項注入器將需要將依賴項(指向命名空間中具體類之一的指針)注入客戶端。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.