我正在尝试实现类似压缩对的东西,并希望它可以轻松构建。我试图通过以下方式做到这一点:
template<size_t N, typename T, bool inherit = std::is_class_v<T>>
struct PairElement;
template<size_t N, typename T>
struct PairElement<N, T, true> : public T{};
template<size_t N, typename T>
struct PairElement<N, T, false>{ T _hidden_value; };
template<typename A, typename B>
class Pair
: public PairElement<0, A>
, public PairElement<1, B>
{
public:
constexpr const A& first() const noexcept
{
if constexpr(std::is_class_v<A>)
return static_cast<const A&>(*this);
else
return PairElement<0, A>::_hidden_value;
}
};
Pair<float, int> pair { 0.5f, 10 };
在只考虑性能的地方,在某些可以使用微不足道的可构造性或空基类优化的情况下,这实际上比 std::pair 更好地进行基准测试。然而,这个实现的一个大问题是它只能在对元素基类型被公共继承的情况下进行聚合初始化,这很烦人,因为可以调用对元素的函数等等。有没有办法显式隐藏所有基函数和成员,或者有没有办法支持聚合初始化而没有公共基类型并且不放弃空基类优化或如果 A 和 B 是可构造的琐碎可构造性?