使用返回constexpr对进行模板实例化

时间:2019-08-09 20:14:58

标签: c++ templates c++17 constexpr

我正在尝试使用std::pair自由函数返回的constexpr数据。第一个元素确定std::array的大小,而第二个元素存储在数组中。

using DataBundle = std::pair<int, std::pair<int, int>>;

constexpr DataBundle get_data()
{
    // other work carried out here
    return std::make_pair(1, std::make_pair(2, 3));
}

struct x
{
    template<int size>
    using OtherData = std::array<std::pair<int, int>, size>;

    static constexpr OtherData<get_data().first> foo { get_data().second };
};

上面的代码效率不高,因为get_data()foo的实例化中被两次调用。一种解决方案是将返回的数据存储为结构x的成员,如下所示。

// previous code remains the same

struct x
{
    template<int size>
    using OtherData = std::array<std::pair<int, int>, size>;

    static constexpr DataBundle foo_bundle = get_data(); 
    static constexpr OtherData<foo_bundle.first> foo { foo_bundle.second };
};

尽管此解决方案似乎并未充分利用模板机制。所以我的问题是,是否有更好的方法可以从上述每个样本中获得最大的收益?

1 个答案:

答案 0 :(得分:2)

独立的constexpr函数可能要计算多次(而模板类只应实例化一次),对于平凡的情况,第一个代码片段就可以了。

我会创建专用的函数/ lambda来创建foo

struct x
{
    template<int size>
    using OtherData = std::array<std::pair<int, int>, size>;

    static constexpr auto foo = []() {
        constexpr DataBundle foo_bundle = get_data(); 

        return OtherData<foo_bundle.first>{foo_bundle.second};
    } ();
};