gpt4 book ai didi

c++ - if/else 在 C++ 的编译时?

转载 作者:IT老高 更新时间:2023-10-28 22:35:45 24 4
gpt4 key购买 nike

考虑以下代码:

#include <iostream>
#include <type_traits>

template<typename T> class MyClass
{
public:
MyClass() : myVar{0} {;}
void testIf() {
if (isconst) {
myVar;
} else {
myVar = 3;
}
}
void testTernary() {
(isconst) ? (myVar) : (myVar = 3);
}

protected:
static const bool isconst = std::is_const<T>::value;
T myVar;
};

int main()
{
MyClass<double> x;
MyClass<const double> y;
x.testIf();
x.testTernary();
y.testIf(); // <- ERROR
y.testTernary(); // <- ERROR
return 0;
}

对于 x(非常量)没有问题。但是 y(const 数据类型)会导致错误,即使 if/else 中的条件在编译时是已知的。

是否有可能在编译时不编译错误条件?

最佳答案

C++17 if constexpr

哦,是的,它已经到了:

main.cpp

#include <cassert>
#include <type_traits>

template<typename T>
class MyClass {
public:
MyClass() : myVar{0} {}
void modifyIfNotConst() {
if constexpr(!isconst) {
myVar = 1;
}
}
T myVar;

protected:
static constexpr bool isconst = std::is_const<T>::value;
};

int main() {
MyClass<double> x;
MyClass<const double> y;
x.modifyIfNotConst();
y.modifyIfNotConst();
assert(x.myVar == 1);
assert(y.myVar == 0);
return 0;
}

GitHub upstream .

编译运行:

g++-8 -std=c++17 -Wall -Wextra -pedantic -o main.out main.cpp
./main.out

另请参阅:Difference between "if constexpr()" Vs "if()"

这将与 C++20“字符串文字模板参数”一起非常酷:Passing a string literal as a parameter to a C++ template class

在 Ubuntu 16.04 中测试,GCC 8.1.0 .

关于c++ - if/else 在 C++ 的编译时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12160765/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com