std::tie 用于较少的比较和 char 数组

Posted

技术标签:

【中文标题】std::tie 用于较少的比较和 char 数组【英文标题】:std::tie for less comparison and char arrays 【发布时间】:2020-11-20 11:09:05 【问题描述】:

我一直都知道,要以一种快速的方式实现一个类的运算符

例如

struct TestInt

int a = 0;
int b = 0;
;

TestInt first;
TestInt second(first);

bool aLess = std::tie( first.a, first.b)
  < std::tie(second.a, second.b);
bool bLess = std::tie( first.a, first.b)
  > std::tie(second.a, second.b);
EXPECT_EQ(aLess, false);
EXPECT_EQ(bLess, false);
EXPECT_EQ(aLess, bLess);

如果您使用另一个包含字符数组的成员的结构,则相同的方法不起作用 喜欢:

struct TieTestChar
  
  char a[10];
  int b=0;
  TieTestChar() strcpy(a, "test");
  ;

TieTestChar first;
TieTestChar second(first);

bool aLess = std::tie( first.a, first.b)
  < std::tie(second.a, second.b);
bool bLess = std::tie( first.a, first.b)
  > std::tie(second.a, second.b);
EXPECT_EQ(aLess, false);
EXPECT_EQ(bLess, false);
EXPECT_EQ(aLess, bLess);

我错过了什么?

[已编辑测试用例]

【问题讨论】:

我想那是因为你想比较char[]的地址 有道理 使用strncmpstrncasecmp比较char[] 我正在寻找一种比较结构的通用方法。 std::tie 曾经用于我以前的测试,但在这种情况下不是 而不是char[] 使用std::string 【参考方案1】:

您可能会模仿 std::tie 与 C 数组的特殊情况,类似

template <typename T>
struct my_ref

    using type = T&;
;

template <typename T, std::size_t N>
struct my_ref<T[N]>

    using type = my_span<T/*, N*/>; // std::span doesn't provide comparison operators
;

template <typename T>
using my_ref_t = typename my_ref<T>::type;

template <typename ... Ts>
std::tuple<my_ref_t<Ts>...> my_tie(const Ts&... args)  return args...; 

【讨论】:

有趣的解决方案。所以你建议我创建一种带有比较操作的 std::span ?您认为还有更简单的解决方案吗? 我期待std::span 的比较功能,所以提供的答案会很好而且很简单。当我检查情况并非如此时,创建自己的 span 似乎是可行的方法(span 实现起来并不复杂)。 感谢您的反馈。我希望有一个更快的替代方案,但我会尝试找到有关 span 的更多详细信息

以上是关于std::tie 用于较少的比较和 char 数组的主要内容,如果未能解决你的问题,请参考以下文章

通过基本函数在较少的大数组中聚合许多小数组

列较少的 Visual Studio 数据比较

Rake任务,用于在Rails目录中编译较少的表

Sas程序优化使用较少的工作空间

集合的特点

与其他同类网站的比较