簡體   English   中英

使用 is_same_v 自動類型推導

[英]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" );
}

statauto只是為了讓它暫時編譯。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM