constexp-6ren">
gpt4 book ai didi

c++ - 变量模板 "SFINAE"不工作

转载 作者:行者123 更新时间:2023-11-27 22:51:55 26 4
gpt4 key购买 nike

我正在尝试使用“SFINAE”实现 cbor 格式的尺寸代码,因为找不到更好的词。但它不起作用,因为 size_code<3> ,例如,评估为 0x1b .怎么了?

template <::std::size_t N,
typename = ::std::enable_if_t<N <= 0x17>
>
constexpr ::std::uint8_t const size_code = N;

template <::std::size_t N,
typename = ::std::enable_if_t<(N > 0x17) &&
(N <= ::std::numeric_limits<::std::uint8_t>::max())
>
>
constexpr ::std::uint8_t const size_code = 0x18;

template <::std::size_t N,
typename = ::std::enable_if_t<
(N > ::std::numeric_limits<::std::uint8_t>::max()) &&
(N <= ::std::numeric_limits<::std::uint16_t>::max())
>
>
constexpr ::std::uint8_t const size_code = 0x19;

template <::std::size_t N,
typename = ::std::enable_if_t<
(N > ::std::numeric_limits<::std::uint16_t>::max()) &&
(N <= ::std::numeric_limits<::std::uint32_t>::max())
>
>
constexpr ::std::uint8_t const size_code = 0x1a;

template <::std::size_t N,
typename = ::std::enable_if_t<
(N > ::std::numeric_limits<::std::uint32_t>::max()) &&
(N <= ::std::numeric_limits<::std::uint64_t>::max())
>
>
constexpr ::std::uint8_t const size_code = 0x1b;

最佳答案

你不能像那样重新定义变量模板,所以你的代码不应该工作。

使用 constexpr 函数会简单得多,如下所示:

template <typename T> constexpr T t_max = std::numeric_limits<T>::max(); 

constexpr std::uint8_t size_code (std::size_t n) {
if (n <= 0x17) return n;
if (n <= t_max<std::uint8_t>) return 0x18;
if (n <= t_max<std::uint16_t>) return 0x19;
if (n <= t_max<std::uint32_t>) return 0x1a;
if (n <= t_max<std::uint64_t>) return 0x1b;
}

关于c++ - 变量模板 "SFINAE"不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36420781/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com