我正在尝试使用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 };
};
尽管此解决方案似乎并未充分利用模板机制。所以我的问题是,是否有更好的方法可以从上述每个样本中获得最大的收益?
答案 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};
} ();
};