[英]std::is_same_v<> returns false for enum declared with type?
[英]Automatic type deduction using is_same_v
我在模板中有一些代碼,如下所示:
if constexpr ( std::is_same_v<T, CompletedGeneration> ) {
auto stat = stats->getGenerationStats();
} else if constexpr ( std::is_same_v<T, CompletedReset> ) {
auto stat = stats->getResetStats();
} else if constexpr ( std::is_same_v<T, CompletedRun> ) {
auto stat = stats->getRunStats();
} else {
static_assert( false, "Invalid type for helper function" );
}
stat
的auto
只是為了讓它暫時編譯。 stats
類型為T
在這個 if 語句之后,有一堆代碼依賴於stat
,所以顯然我不能在if
部分定義它。 我想知道,我將如何在if
之外定義它,因為它的類型取決於模板參數類型T
(但不是T
本身)?
我是否必須指定一個額外的模板參數U
,它接受stat
的類型? 或者必須使用某種繼承? 我寧願避免這兩種選擇。
您可以將其包裝在立即調用的 lambda 表達式中
auto stat = [&] {
if constexpr ( std::is_same_v<T, CompletedGeneration> ) {
return stats->getGenerationStats();
} else if constexpr ( std::is_same_v<T, CompletedReset> ) {
return stats->getResetStats();
} else if constexpr ( std::is_same_v<T, CompletedRun> ) {
return stats->getRunStats();
}
}();
這也消除了對不明智的static_assert(false)
,它現在被具有無效類型void
stat
取代。
您可以使用類型特征:
template <typename T>
struct stats_type;
template <>
struct stat_type<CompletedGeneration> {
using type = decltype(std::declval<T>().getGenerationStats());
};
// and similar for the other cases
stat
的正確類型就是stat_type<T>::type;
然而,這可能有點老派和太多的樣板。 為了完整起見,我只想提及它。 另一方面,如果您將相應的函數調用包裝在stat_type
的構造函數中,那么您可以將整個constexpr if-else
替換為一行stats_type<T>::type stat{stats};
.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.