使用 is_same_v 自动类型推导

Chr*_*sMM 4 c++ templates

我在模板中有一些代码,如下所示:

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" );
}
Run Code Online (Sandbox Code Playgroud)

autostat只是为了得到它暂时编译。stats是类型T

在这个 if 语句之后,有一堆代码依赖于stat,所以显然我不能在if部分中定义它。我想知道,我将如何在 之外定义它if,因为它的类型取决于模板参数类型T(但不是它T本身)?

我是否必须指定一个额外的模板参数U,它接受类型为stat?或者必须使用某种继承?我宁愿避免这两种选择。

Sto*_*ica 10

您可以将其包装在立即调用的 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();
    }
}();
Run Code Online (Sandbox Code Playgroud)

这也省去了不明智的 static_assert(false),现在被替换stat为无效类型void