我在模板中有一些代码,如下所示:
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" );
}
auto
的 stat
只是为了让它暂时编译。 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();
}
}();
这也消除了对 ill-advised
static_assert(false)
的需要,它现在被具有无效类型 stat
的 void
所取代。
关于c++ - 使用 is_same_v 自动类型推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59988055/