C++17编译期ifconstexpr

用例:不加constexpr会编译出错,因为必有一种情况是语法错误的。如果TX类型,则内部没有y_func()

1
2
3
4
5
6
7
8
9
template<typename T>
void f(T t) {
	// 判断类型
	if constexpr (std::is_same_v<T, X>) {
		t.x_func();
	} else { // 此处若为 "舍弃语句",不会参加编译。但会检查语法错误(但不会检查模板的实例化)。而预处理器if(#if)如果舍弃,完全不检查。
		t.y_func();
	}
}

返回类型推导:C++14后可以用auto作为函数返回值,但所有表达式必须推导出相同的返回类型(不能在不同情况下返回不同的类型,例如intfloat)。但如果在判断的地方使用constexpr,能通过编译(因为是在编译期判断的)。

1
2
3
4
5
6
7
auto func() {
	if constexpr (...) {
		return 1.0f;
	} else {
		return 0;
	}
}