gpt4 book ai didi

c++ - 在编译时比较两个整数序列?

转载 作者:太空狗 更新时间:2023-10-29 23:32:40 25 4
gpt4 key购买 nike

假设我有一个 constexpr std::integer_sequence<...>目的。在编译时,我对其执行一些操作,然后我想 static_assert它是==其他一些std::integer_sequence<...> .鉴于 integer_sequence是一种类型,我将如何提供重载的 constexpr bool operator==这将适本地比较它们?

一个更具体的例子:转换intstd::integer_sequence<char> .即整数到字符序列(inspired by Peter Sommerlad's talk at CPPCon '15)的转换

我有一些函数,我非常有信心将小于 1000 的十进制整数值适本地转换为 4 元素字符序列:

#include <utility> // integer_sequence

template<char... t>
using char_sequence = std::integer_sequence<char, t...>;
constexpr char make_digit_char(const size_t digit, const size_t power_of_ten=1, const char zero_replacement = ' ')
{
return char(digit>=power_of_ten?digit/power_of_ten+'0':zero_replacement);
}

template<int num>
constexpr auto int_to_char_sequence()
{
static_assert(num < 1000, "Cannot handle integers larger than 1000!");
//format for up to 1000
return char_sequence<' ',
make_digit_char(num,100),
make_digit_char(num%100,10,num>=100?'0':' '),
'0' + num % 10>{};
}

但是,我不相信自己,所以我想写一些测试:

static_assert(char_sequence<' ', ' ', ' ', '0'>{} == int_to_char_sequence<0>(), "failed to convert 0 to char sequence");
static_assert(char_sequence<' ', ' ', ' ', '1'>{} == int_to_char_sequence<1>(), "failed to convert 1 to char sequence");
// ...
static_assert(char_sequence<' ', '1', '1', '1'>{} == int_to_char_sequence<111>(), "failed to convert 111 to char sequence")

也想测试!= :

// ...
static_assert(char_sequence<' ', '1', '1', '1', '2'>{} != int_to_char_sequence<111>(), " 1 1 1 2 should not be equal to 111");
static_assert(int_to_char_sequence<111>() != char_sequence<' ', '1', '1', '1', '2'>{}, " 111 should not be equal to 1 1 1 2");

所以我对等价运算符有一些要求:

  • 序列中的数据存储在类型中,所以两个字符序列是根本不同的类型
  • 如果一个字符序列比另一个长怎么办?
  • 运算符必须是 constexpr这样static_assert将工作
    • 这意味着我们无法对 std::array 进行任何类型的转换并比较

我该如何实现?


作者注:我没有找到关于 SO 的另一篇文章可以对整数序列进行编译时相等,所以我在下面回答了我自己的问题。这是我自己完成的工作,我绝不声称这是最佳方法。如果您有更好的方法,请将其作为另一个答案发布,我会接受它!

最佳答案

这是一个较短的版本:

template <char... A, char... B>
constexpr bool operator==(char_sequence<A...>, char_sequence<B...>)
{
return std::is_same<char_sequence<A...>, char_sequence<B...>>::value;
}

当且仅当由这些序列组成的类型相同时,序列才相同。


虽然通常情况下,您会直接测试它:

template <int num>
using int_to_char_sequence_t = decltype(int_to_char_sequence<num>());

static_assert(std::is_same<
int_to_char_sequence_t<0>,
char_sequence<' ', ' ', ' ', '0'>
>::value, "!");

关于c++ - 在编译时比较两个整数序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32849128/

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