我有一個模板函式,它處理 2 種型別的類(具有舊格式或新格式)。我想定義一個變數,該變數將在編譯時定義其型別,例如:
template <typename T>
using MyType = std::conditional_t<isNewFormatCondition<T>, typename T::subClass::Format, typename T::Format::reference>
template <typename T>
extract(T& t){
MyType<T> var{t.getFormat()};
}
我的意思是,對于新類 T,var 的型別為 T::subClass::Format,而對于舊類,它的型別為 T::Fromat&
更多背景:
- 這兩種型別的類都支持 getFormat()。
- 自然這不會編譯,因為舊類中沒有 'subClass::Format',反之亦然
- 這個問題回答了 std::conditional 的兩個分支都編譯時的情況:如何根據模板引數有條件地宣告區域變數?
uj5u.com熱心網友回復:
std::conditional_t
不是 SFINAE,所有模板引數都必須有效。您可以使用 SFINAE 或簡單的專業化:
#include <type_traits>
#include <iostream>
template <typename T,bool>
struct MyType;
template <typename T>
struct MyType<T,false> {
using type = int;
};
template <typename T>
struct MyType<T,true> {
using type = double;
};
template <typename T,bool b>
using MyType_t = typename MyType<T,b>::type;
int main() {
std::cout << std::is_same_v< MyType<void,true>::type, double> << "\n";
std::cout << std::is_same_v< MyType<void,false>::type, int> << "\n";
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/508345.html