这是什么真实的用例?
a=b
我可以理解这是一个值为2的包装器:
std::integral_constant
但为什么不使用2或用2?
定义const int值答案 0 :(得分:4)
在某些情况下,std::integral_constant
非常有用。
其中一个是标签发送。例如,std::true_type
和std::false_type
分别只是std::integral_constant<bool, true>
和std::integral_constant<bool, false>
。每个type trait都来自std::true_type
或std::false_type
,可启用代码分发:
template <typename T>
int foo_impl(T value, std::true_type) {
// Implementation for arithmetic values
}
template <typename T>
double foo_impl(T value, std::false_type) {
// Implementation for non-arithmetic values
}
template <typename T>
auto foo(T value) {
// Calls the correct implementation function, which return different types.
// foo's return type is `int` if it calls the `std::true_type` overload
// and `double` if it calls the `std::false_type` overload
return foo_impl(value, std::is_arithmetic<T>{});
}
此外,模板元编程库通常只在类型列表而不是值列表上具有算法。如果您想将这些算法用于值,则必须使用std::integral_constant
答案 1 :(得分:3)
2
是值,而two_t
是一种类型。它们是两种不同的抽象。每个都有它的目的。
您无法在预期类型的地方使用2
您无法使用two_t
,其中包含预期的整数值。
更重要的是,std::true_type
和std::false_type
是std::integral_constant
中使用最广泛的专精。它们广泛用于type_traits
。
答案 2 :(得分:1)
下面的代码段是我使用std :: integral_constant创建一个具有通用值的api的方法,但是它还会在编译时检查您提供的值是否有效。
#include<iostream>
struct Value {};
struct Color {};
struct Size {};
struct Point {};
enum class Property {
Color,
StrokeColor,
Opacity,
Size,
Position,
};
class Dom {
public:
// give a single api to setValue
template<Property prop, typename AnyValue>
void setValue(const std::string &obj, AnyValue value){
setValue(std::integral_constant<Property, prop>{}, obj, value);
}
private:
// specialization for each property and value type pair.
void setValue(std::integral_constant<Property, Property::Color> type,
const std::string &obj,
Color col) {std::cout<<" update color property\n";}
void setValue(std::integral_constant<Property, Property::StrokeColor> type,
const std::string &obj,
Color col){std::cout<<" update stroke color property\n";}
void setValue(std::integral_constant<Property, Property::Opacity> type,
const std::string &obj,
Value opacity){std::cout<<" update opacity property\n";}
};
int main()
{
Dom domObj;
// try to update the color property of rect1 object inside layer1
domObj.setValue<Property::Color>("layer1.rect1", Color());
// compile time error expects Color value but given Size value
//domObj.setValue<Property::Color>("layer1.rect1", Size());
return 0;
}