C++ 如何在多变量结构的“b_mipmaps&&other.b_mipmaps为真
与“的首选实现类似,您可以使用几个if 你可以使用几个ifC++ 如何在多变量结构的“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
由于不知道代码中的变量类型是什么,我发现很难使用变量名提出建议 从您的代码来看,如果 此->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
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));
}