c++ - 使用 is_same_v 自动类型推导

标签 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" );
}
autostat 只是为了让它暂时编译。 statsT 类型

在这个 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) 的需要,它现在被具有无效类型 statvoid 所取代。

关于c++ - 使用 is_same_v 自动类型推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59988055/

相关文章:

c++ - 如何格式化不带引号的 boost 路径对象?

c++ - 如何修复以下代码中的转换错误?

在 Flask render_template 期间使用相对路径找不到 Javascript 文件

c++ - 从其(部分)特化调用类模板的静态函数

c++ - OpenCV C++ 中的 mask 彩色图像

c++ - Boost adjacency_list 需要帮助

c++ - 如何为每个派生类存储一个可以从基类访问的魔数(Magic Number)?

c++ - 不允许指向不完整类类型的指针

Django 模板从数据库渲染并解释标签

c++ - 从可变参数函数将函数应用于参数包的所有元素