C++ 如何在多变量结构的“b_mipmaps&&other.b_mipmaps为真

C++ 如何在多变量结构的“b_mipmaps&&other.b_mipmaps为真,c++,operator-overloading,structure,C++,Operator Overloading,Structure,与“的首选实现类似,您可以使用几个if 你可以使用几个if 由于不知道代码中的变量类型是什么,我发现很难使用变量名提出建议 从您的代码来看,如果 此->b_mipmaps&&other.b_mipmaps为真 我使用以下模式: bool operator <(const Key &other) const { if ( this->member1 != other.member1 ) { return (this->member1 < ot

与“的首选实现类似,您可以使用几个if

你可以使用几个if


由于不知道代码中的变量类型是什么,我发现很难使用变量名提出建议

从您的代码来看,如果

此->b_mipmaps&&other.b_mipmaps为真

我使用以下模式:

bool operator <(const Key &other) const
{
   if ( this->member1 != other.member1 )
   {
      return (this->member1 < other.member1);
   }

   if ( this->member2 != other.member2 )
   {
      return (this->member2 < other.member2);
   }

   //
   // ...
   //

   return (this->memberN < other.memberN);
}


选择你认为更具可读性的风格。我发现第一种形式更具可读性。

由于不知道代码中变量的类型,我发现很难使用变量名来推荐某些内容

从您的代码来看,如果

此->b_mipmaps&&other.b_mipmaps为真

我使用以下模式:

bool operator <(const Key &other) const
{
   if ( this->member1 != other.member1 )
   {
      return (this->member1 < other.member1);
   }

   if ( this->member2 != other.member2 )
   {
      return (this->member2 < other.member2);
   }

   //
   // ...
   //

   return (this->memberN < other.memberN);
}

选择你认为更具可读性的风格。我发现第一个表单更具可读性。

您可以使用std::tie:

bool operator <(const Key &other) const
{
    return std::tie(s_name, b_mipmaps, b_clamp_to_edge, n_intformat) <
        std::tie(other.s_name, other.b_mipmaps, other.b_clamp_to_edge, other.n_intformat);
}
不要忘了包括

您可以使用std::tie来实现:

bool operator <(const Key &other) const
{
    return std::tie(s_name, b_mipmaps, b_clamp_to_edge, n_intformat) <
        std::tie(other.s_name, other.b_mipmaps, other.b_clamp_to_edge, other.n_intformat);
}

不要忘记将@lisyarus极好的答案包括在内,但要避免重复字段名:

bool operator <(const Key &other) const
{
    auto fields = [](decltype(*this) v) {
        return std::tie(v.s_name, v.b_mipmaps, v.b_clamp_to_edge, v.n_intformat);
    };
    return (fields(*this) < fields(rhs));
}

对于@lisyarus,答案非常好,但避免重复字段名:

bool operator <(const Key &other) const
{
    auto fields = [](decltype(*this) v) {
        return std::tie(v.s_name, v.b_mipmaps, v.b_clamp_to_edge, v.n_intformat);
    };
    return (fields(*this) < fields(rhs));
}


是否绝对需要使用一条语句?将其拆分为多条语句和变量?@Jongware如何使用多条语句?有明显的优势吗?你只会迷失在大括号里吗?这不是重复的-另一个问题的名称假设你了解tie和tuple,更不用说C++11兼容性的潜在问题。@另一个问题为实现运算符提供了很好的答案。是否绝对需要使用一条语句来实现此操作?将其分解为多条语句和变量?@Jongware如何使用多条语句?有明显的优势吗?你只会迷失在大括号里吗?这不是重复的问题-另一个问题的名称假设你了解tie和tuple,更不用说C++11兼容性的潜在问题了。@Puppy另一个问题为实现运算符提供了很好的答案,这几乎是一种模式。如果你把琴弦和琴弦一样,它会很干净。一个合理优化的编译器应该能够得到与我的单个语句相同的结果。对,这几乎是一种模式。如果你把琴弦和琴弦一样,它会很干净。一个合理优化的编译器应该能够得到与我的单个语句相同的结果。是的,这是timrau答案中的模式,有更多实际上不需要的大括号。不错,但我没想到。我猜我已经用了太多的序言:@Thessue,那些额外的牙套,即使在这种情况下不需要,也让我避免了不少错误:@Thessue:这就是我所想的,根本不在乎卷曲的牙套。每一行本身就是一个早期的选择退出,如果选择,将返回正确的结果。哦,很抱歉没有发布我的结构声明。s_u是std::string,b_u是bool,n_u是任何int-ish类型。我知道我只能比较布尔值,但无论出于什么原因,这对我来说都是一个厄运。如果两个结构中对应的布尔值都为真,那么它们相等,测试将转到下一个变量。如果我错了,请纠正我,但我相信你是对的!b_mipmaps&&other.b_mipmaps等同于b_mipmaps为这个带来动力。我将记住这一点,当我切换到C++ 14时,@ StSuffC++ 11对于STD::TIE是足够的:可能包括关于C++标准版本的信息,是的,我知道11。我希望在下一个大项目中使用14,跳过11。我在这里提到了标准。在C++14中,你也可以用自动替换decltype*这个。@U猪当然可以。需要升级我的编译器!!在C++14中,您也可以用auto替换decltype*这个命令。@U猪当然可以。需要升级我的编译器!!
bool operator <(const Key &other) const
{
    auto fields = [](decltype(*this) v) {
        return std::tie(v.s_name, v.b_mipmaps, v.b_clamp_to_edge, v.n_intformat);
    };
    return (fields(*this) < fields(rhs));
}