首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C++中跳过无法编译的代码?

如何在C++中跳过无法编译的代码?
EN

Stack Overflow用户
提问于 2020-12-30 14:23:13
回答 1查看 153关注 0票数 1

想象下一个没有编译的代码:

在网上试试!

代码语言:javascript
复制
#include <type_traits>
#include <iostream>

int main() {
    struct A { int i = 123; };
    struct B { int j = 456; };
    B x;
    if constexpr(std::is_same_v<decltype(x), A>)
        std::cout << "A: " << x.i;
    else if constexpr(std::is_same_v<decltype(x), B>)
        std::cout << "B: " << x.j;
}

通过这段代码,我希望有几个不同类型的代码分支。一般情况下,我想要不同的分支,不仅针对特定的类型,而且针对任何一个星座条件。

上面的代码是不可编译的,因为看起来编译器总是尝试编译所有的if-constexpr分支,即使它们有编译时间为false的条件。

当然,我可以通过使用模板结构专门化来解决上面的任务,如下所示:

在网上试试!

代码语言:javascript
复制
#include <type_traits>
#include <iostream>

template <size_t Id>
struct Code;

template <>
struct Code<0> {
    template <typename AT>
    void operator()(AT & x){
        std::cout << "A: " << x.i;
    }
};

template <>
struct Code<1> {
    template <typename BT>
    void operator()(BT & x){
        std::cout << "B: " << x.j;
    }
};

int main() {
    struct A { int i = 123; };
    struct B { int j = 456; };
    B x;
    Code<std::is_same_v<decltype(x), A> ? 0 : std::is_same_v<decltype(x), B> ? 1 : -1>()(x);
}

但最后一个解决方案有几个缺点: 1)它更冗长,需要更多的代码行。2)需要全局定义代码结构,因为模板结构只能全局定义。3)它需要所有所需的参数才能将代码传递/转发给operator()调用。

constexpr变体看起来更优雅,使用起来更直观。有什么办法可以解决这样的任务吗?强制编译器不要编译时错误分支.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-30 14:49:33

正如注释中提到的,“必须使丢弃的语句依赖于模板参数” --如果不引入模板,就不可能完成您想要做的事情。

例如,这将“工作”,但它远远不是一个好的解决方案。我加上它作为答案,因为与我标记为复制的问题的相似性有争议。

代码语言:javascript
复制
#include <type_traits>
#include <iostream>

int main() {
    struct A { int i = 123; };
    struct B { int j = 456; };
    B x;
    
    [](auto const & x) {
        if constexpr(std::is_same_v<std::remove_cvref_t<decltype(x)>, A>) {
            std::cout << "A: " << x.i;
        } else if constexpr(std::is_same_v<std::remove_cvref_t<decltype(x)>, B>) {
            std::cout << "B: " << x.j;
        }
    }(x);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65508488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档