#include <iostream>
#include <type_traits>
int main(){
//creating an integral constant with constexpr
constexpr unsigned int speed_of_light{299792458};
//creating an integral constant with std::integral_constant
typedef std::integral_constant<unsigned int, 299792458> speed_of_light_2;
//using them
std::cout << speed_of_light/2 << '\n';
std::cout << speed_of_light_2::value/2 << '\n';
}
我会选择在constexpr上使用std :: integral_constant有什么特别之处?
他们的行为和用例看起来与我相同。我正在尝试考虑某种模板场景,其中constexpr可能不够。
答案 0 :(得分:32)
模板integral_constant
定义了一种类型,关键字constexpr
定义了一个常量。
例如,std::true_type
为std::integral_constant<bool, true>
。
其中一个用法示例是tag-dispatching
。
template<typename T>
void use_impl(const T&, std::false_type)
{
}
template<typename T>
void use_impl(const T&, std::true_type)
{
}
template<typename T>
void use(const T& v)
{
use_impl(v, typename std::is_integral<T>::type());
}
答案 1 :(得分:5)
它可以与三元运算符一起使用 例如
void gotoN_impl(std::integral_constant<int,0>::type)
{
std::cout << "GoTo 0" << '\n';
}
void gotoN_impl(std::integral_constant<int,1>::type)
{
std::cout << "GoTo 1" << '\n';
}
void gotoN_impl(std::integral_constant<int,2>::type)
{
std::cout << "GoTo 2" << '\n';
}
void gotoN_impl(std::integral_constant<int,3>::type)
{
std::cout << "GoTo 3" << '\n';
}
template<int N>
void gotoN()
{
gotoN_impl(typename std::integral_constant<int, N>::type());
}
int main()
{
gotoN<0>();
gotoN<1>();
gotoN<2>();
gotoN<3>();
constexpr auto x = 99;
gotoN<x<4?x:3>(); // with a ternary operator
}