如何在参数包中找到最大值?

斯威夫特-星期五派

这是一个问题的示例:常量变量的模板应基于参数扩展其类型。尽管直接方法是可行的,但通过提供类型的大小或基础类型名,则容易出错。

#include <iostream>

template<size_t bit>
constexpr const uint16_t BIT = 1 << bit;

template<size_t... bits>
constexpr const uint16_t BITS = (uint16_t(1 << bits)|...);

int main()
{
    std::cout << BITS<0,1,3,12> << std::endl;
}

想法是实现模板数据类型,该数据类型将返回type为无符号整数,至少为参数包中最大值的大小。这也将允许检查模板参数是否合理。

讲故事的人-Unslander Monica

在C ++ 17中非常简单。我们可以通过简单调用来计算最大值std::max初始化列表重载constexpr自C ++ 14以来)。

我们将需要插入一个将大小映射到整数类型的实用程序中的结果,但是现在编写起来相当简单:

template<std::size_t N>
struct size2Type {
    static auto type_calculator() {
        static_assert( N < 64 );
        if constexpr ( N < 8 )
            return uint8_t{};
        else if constexpr ( N < 16 )
            return uint16_t{};
        else if constexpr ( N < 32 )
            return uint32_t{};
        else
            return uint64_t{};
    }

    using type = decltype(type_calculator());
};

然后,将其用于您的原始示例中:

template<size_t bit>
constexpr typename size2Type<bit>::type BIT = (typename size2Type<bit>::type)(1) << bit;

template<size_t... bits>
constexpr typename size2Type<std::max({std::size_t(0), bits...})>::type BITS = (BIT<bits> | ... | 0);

我没有美化演员表,但是也可以编写一个实用程序来完成该任务。

您可以实时看到它

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章