我不確定這是否可行。我想在我的類的建構式中初始化一個變數模板。
template<typename T>
T var_tem;
Struct A {
template<typename U>
A(U u) { var_tem<U> = u;}
};
我想知道var_tem<U>以后是否可以在不知道 type的情況下訪問U。另外,我知道每當我訪問時var_tem<>,只存在一個實體化。var_tem如果我讓我的班級作為成員資料保存,這會容易得多。但是由于此處討論的問題,我有其他方法我寧愿不制作模板,函式模板的部分屬性在 GCC 中被靜默忽略。基本上,我有一些內部靜態資料需要發送到特定部分。
uj5u.com熱心網友回復:
呼叫建構式后型別的資訊U不可用。但是,在訪問點,您還需要了解型別,否則您將不知道可以用它做什么。因此,要么直接指定型別,要么傳遞訪問者。
現在,對于訪問者來說,只要有一組編譯時限制的簽名,就可以了。您只需要列舉這些型別并進行型別切換(并存盤指向變數的指標):
template<typename T>
T var_tem;
Struct A {
template<typename U>
A(U u)
{
var_tem<U> = u;
var = &var_tem<U>;
}
void tryVisit() {}
template<typename V, typename T, typename... Ts>
void tryVisit(V& v)
{
if (var == &var_tem<T>) {
v(*static_cast<T*>(var));
} else {
tryVisit<V, Ts...>(v);
}
}
}
}
private:
void* var;
};
如果列出型別不是一種選擇,還有另一種可能性,但僅建議用于錯誤處理程式:您可能會將其作為例外拋出。例外處理程式是可鏈接的,因此您不需要擁有所有可能型別的特定點(但處理程式仍列在堆疊上)。請注意,您只能以這種方式處理特定型別,沒有模板例外處理程式。然后可以將 throw 函式存盤為std::function<void(void)>:
template<typename T>
T var_tem;
Struct A {
template<typename U>
A(U u)
: throwTheVar([]() { throw var_tem<U>; })
{ var_tem<U> = u; }
void throwAsError() { throwTheVar(); }
private:
std::function<void()> throwTheVar;
};
如果它不是錯誤處理程式,那么我不建議拋出;但您仍可能std::function<>使用此 lambda 邏輯填充 s 的有限介面。它的問題是它非常慢:在內部,std::function<>是虛擬指標還是函式指標,具體取決于您的實作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/529536.html
標籤:C 模板
