考虑以下代码
#include <type_traits>
template<bool Test, class T, T val1, T val2>
constexpr T if_v = std::conditional_t<Test,
std::integral_constant<T, val1>,
std::integral_constant<T, val2>>::value;
int main()
{
constexpr size_t value1 = 123;
constexpr size_t value2 = 456;
constexpr bool test = (3 > 2);
constexpr size_t r0 = if_v<test, size_t, value1, value2>; // = 123
return 0;
}
由于我们在编译时就知道value1
and的类型是什么value2
,所以我们不必指定它。所以我们可以写
template<bool Test, auto val1, auto val2>
constexpr decltype(val1) if_v = std::conditional_t<Test,
std::integral_constant<decltype(val1), val1>,
std::integral_constant<decltype(val2), val2>>::value;
这样我们就可以编写一个简化的if语句if_v<test, value1, value2>
(没有类型)。理想情况下,我还想确保两个输入值的类型相同。但我不确定如何在使用auto
.
基本上,有没有更好的方法来定义if_v
这样我们可以if_v<test, value1, value2>
在不必指定类型的情况下编写,同时还能以某种方式static_assert
实现类型相等?