template <typename Stru_>
class templateClasse{
public:
using stru = Stru_;
static void method_0(int sk, int sl){
printf("class templateClass method_0 sk: %d sl: %d\n", sk, sl);
}
static void method_1(int a){
if (stru::isvec){
method_0(0, a);
} else{
method_0(a, 0);
}
}
};
我想method_0根據stru::isvec代碼所示更改依賴于 bool中的輸入,同時,我希望if (stru::isvec) else分支的選擇是在編譯期間而不是運行時進行的。我的問題是:
- 這段代碼是否
method_0在編譯期間選擇了? - 只有當我
static在這兩種方法之前添加關鍵字時,代碼才能成功編譯。為什么要static在這種情況下作業?通常,我的理解static是這樣的:
這些靜態變數存盤在靜態存盤區中,而不是在堆疊中。
我知道什么時候使用static const int tmp = 50;它tmp是在編譯時計算的。那么可以static粗略的理解為關鍵字來幫助編譯時計算嗎?
- 在這種情況下,我們有其他解決方案嗎?
提前致謝!
uj5u.com熱心網友回復:
- 這段代碼是否
method_0在編譯期間選擇了?
不,調度發生在運行時。
您可以使用constexpr if (C 17 起)在編譯時執行分派。
void method_1(int a){
if constexpr (stru::isvec){
method_0(0, a);
} else{
method_0(a, 0);
}
}
- 只有當我
static在這兩種方法之前添加關鍵字時,代碼才能成功編譯。
不,你不必。這是一個附帶問題;在類定義static用于宣告static成員未系結到類實體。
居住
使用 C 11,您可以使用SFINAE執行多載。例如
template <typename T = Stru_>
typename std::enable_if<T::isvec>::type method_1(int a){
method_0(0, a);
}
template <typename T = Stru_>
typename std::enable_if<!T::isvec>::type method_1(int a){
method_0(a, 0);
}
居住
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/376720.html
上一篇:C 中的部分類模板引數推導
下一篇:推導回傳型別模板C
