C++ 如果在C+中,如何通过constexpr跳过不可编译的代码+;?

C++ 如果在C+中,如何通过constexpr跳过不可编译的代码+;?,c++,constexpr,compile-time,conditional-compilation,if-constexpr,C++,Constexpr,Compile Time,Conditional Compilation,If Constexpr,想象下一个未编译的代码: #包括 #包括 int main(){ 结构A{int i=123;}; 结构B{int j=456;}; bx; 如果constexpr(std::is_same_v) std::cout如评论中所述,-如果不引入模板,您将无法尝试做什么 例如,这将“起作用”,但它远不是一个好的解决方案。我添加它作为答案,因为与我标记为重复的问题的相似性存在争议 #include <type_traits> #include <iostream> int

想象下一个未编译的代码:

#包括
#包括
int main(){
结构A{int i=123;};
结构B{int j=456;};
bx;
如果constexpr(std::is_same_v)

std::cout如评论中所述,-如果不引入模板,您将无法尝试做什么

例如,这将“起作用”,但它远不是一个好的解决方案。我添加它作为答案,因为与我标记为重复的问题的相似性存在争议

#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);
}
#包括
#包括
int main(){
结构A{int i=123;};
结构B{int j=456;};
bx;
[](自动常量和x){
如果constexpr(std::is_same_v){

std::cout constexpr if仅在函数模板中工作,并且仅在条件取决于模板参数时工作@mrks不,它没有回答我的问题。基本上从这个答案我不知道如何将它应用到我的案例中。你能根据你的链接答案进行转换,这样它就可以工作吗?因为如果不可能,那么我的问题应该被重新打开。为什么不使用预处理器构造呢?@Arty:你的代码没有模板参数,所以你你不能基于模板参数生成条件。因此,如果
constexpr if
可以放弃语句的唯一方法是使条件依赖于模板参数,这意味着你无法使用
constexpr if
执行你试图做的事。它不是宏,也不是
constexpr if
放弃所有sta的工作tements.BTW,而不是
(const auto x)
使用像
(auto const&x)
这样的引用可能更好。谢谢,非常好的解决方案!它适用于我的代码,额外使用
std::remove\u cvref\u t
。接受并对其进行表决!
#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);
}
#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);
}