C++ 如何在C+中定义if和else语句的新行为+;
我正在处理的项目涉及一个类,让它成为myClass,它类似于一个集合,我需要允许程序员以有意义的方式比较这种类型的对象 我希望能够做到的是:C++ 如何在C+中定义if和else语句的新行为+;,c++,if-statement,C++,If Statement,我正在处理的项目涉及一个类,让它成为myClass,它类似于一个集合,我需要允许程序员以有意义的方式比较这种类型的对象 我希望能够做到的是: myClass a, b; ... if (a == b) { //execute code where a and b are implicitly used as // each of a and b's elements, respectively } 并让我的自定义if语句根据对元素对执行的条件,为a和b中的每对元素执行条件代码
myClass a, b;
...
if (a == b)
{
//execute code where a and b are implicitly used as
// each of a and b's elements, respectively
}
并让我的自定义if语句根据对元素对执行的条件,为a和b中的每对元素执行条件代码
下面是一个更具体的例子:
myClass a = {1, 2}, b = {2, 3};
if (a == b)
std::cout << a << " equals " << b << std::endl;
else
std::cout << a << " does not equal " << b << std::endl;
目前,我重载了比较运算符,以返回一个“比较类型”,该类型仅存储两个操作数和用于延迟计算的比较函数。有没有一种方法可以实现这种自定义的if/else行为,以便在if语句接收到“comparison type”类型的参数时发生这种行为?还是有必要只定义一个接受这种类型的对象和对二进制运算符函数的引用作为条件代码的常规函数
我看到了这个问题,但是简单地定义到bool的转换在这种情况下是行不通的。
你可以接近这一点:
myClass a = {1, 2}, b = {2, 3};
for(auto&& cmp:(a == b))
if(cmp)
std::cout << cmp.lhs << " equals " << cmp.rhs << std::endl;
else
std::cout << cmp.lhs << " does not equal " << cmp.rhs << std::endl;
可能有一些输入错误。如果您可以摆脱
If
/else
样式,则可以将If
和else
块的主体作为lambda传递给助手函数
template<class T, class F> void compare_all(const myClass &a, const myClass &b, T fn_true, F fn_false) {
for (const auto &ai: a.vec) {
for (const auto &bi: b.vec) {
if (ai == bi)
fn_true(ai, bi);
else
fn_false(ai, bi);
}
}
}
重载==运算符,然后使用布尔if/else逻辑,然后重新读取它。不,你不能这样做。您可能可以使用and实现类似的功能,但是,我的意思是,只需为编写两个嵌套的
,然后手动迭代,就更容易(更清晰)了。“在这种情况下,简单地定义到bool的转换将不起作用”-为什么不呢?这正是if
语句所期望的。如果重载运算符==
以返回“比较类型”而不是bool
,则该类型必须可转换为bool
。看见在内部,您可以随意比较元素,只要最终结果可以表示为bool
。如果您使用的是C++20,请看一看新的运算符
,它更灵活。不,您不能更改If
和else
的含义来执行受控语句更多次。您可以使用不同的语法获得类似的结果,可能类似于each\u elem\u if\u else(a==b,[](const auto&x,const auto&y){std::cout@RemyLebeau注意,所需的结果包括执行一次if语句和三次else语句。这非常聪明,非常感谢。不过,我能看到的唯一问题是,对于包含大量元素的myClass
操作数,将比较扩展到std::array
将需要su实际内存量。有办法解决这个问题吗?@wwill-yes;查找(:)的
循环可以。你只需要计算*
应该返回什么,++
应该做什么,以及如何处理end和!=
。数组解决方案只是最简单的一个。这与我的想法非常接近,以防无法使用本机if/else样式。这个答案可以通过添加abool(condition)(const myClass&a,const myClass&b)
参数改为compare\u all
,以代替硬编码的运算符==
,以及使fn\u为false
可选。谢谢。
template<class Lhs, class Rhs=Lhs, class Cmp=std::equal<>>
struct comparison_t {
Lhs lhs;
Rhs rhs;
operator bool()const{ return Cmp{}(lhs, rhs); }
};
struct myClass {
int a, b;
auto operator==( myClass const& lhs, myClass const& rhs ){
std::array<comparison_t<int const&>> retval={{
{lhs.a, rhs.a},
{lhs.b, rhs.a},
{lhs.a, rhs.b},
{lhs.b, rhs.b},
}};
return retval;
}
};
template<class T, class F> void compare_all(const myClass &a, const myClass &b, T fn_true, F fn_false) {
for (const auto &ai: a.vec) {
for (const auto &bi: b.vec) {
if (ai == bi)
fn_true(ai, bi);
else
fn_false(ai, bi);
}
}
}
int main() {
myClass a{1, 2}, b{2, 3};
compare_all(a, b,
[](int a, int b) { std::cout << a << " equals " << b << std::endl; },
[](int a, int b) { std::cout << a << " does not equal " << b << std::endl; }
);
}