有std :: integral_constant背后的原因是什么?

时间:2018-03-10 04:01:15

标签: c++ std

这是什么真实的用例?

a=b

我可以理解这是一个值为2的包装器:

std::integral_constant

但为什么不使用2或用2?

定义const int值

3 个答案:

答案 0 :(得分:4)

在某些情况下,std::integral_constant非常有用。

其中一个是标签发送。例如,std::true_typestd::false_type分别只是std::integral_constant<bool, true>std::integral_constant<bool, false>。每个type trait都来自std::true_typestd::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_typestd::false_typestd::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;
}