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);
}