C++17 if constexpr
Oh yes, it has arrived:
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;
}
Compile and run:
g++-8 -std=c++17 -Wall -Wextra -pedantic -o main.out main.cpp
./main.out
See also: Difference between “if constexpr()” Vs “if()”
This will be really cool together with C++20 “string literal template arguments”: Passing a string literal as a parameter to a C++ template class
Tested in Ubuntu 16.04, GCC 8.1.0.