【发布时间】:2018-08-29 02:29:33
【问题描述】:
我正在做的项目涉及一个类,让它成为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 = {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;
结果将在哪里(不一定按此顺序):
1 does not equal 2
2 equals 2
1 does not equal 3
2 does not equal 3
目前,我已经重载了比较运算符以返回一个“比较类型”,它只存储两个操作数和比较函数以进行惰性求值。有没有办法完成这种自定义 if/else 行为,以便在 if 语句接收到“比较类型”类型的参数时发生这种情况?还是只需要定义一个常规函数,它接受这种类型的对象和对二元运算符函数的引用作为条件代码?
我看到了这个问题,但在这种情况下,简单地定义转换为 bool 是行不通的。 C++ 'overloading' the if() statement
【问题讨论】:
-
stackoverflow.com/questions/10575766/… 重载 == 运算符,然后使用布尔 if/else 逻辑
-
再读一遍。不,你不能这样做。您可能可以使用std::next_permutation 和boost::zip_iterator 实现类似的效果,但是,我的意思是,编写两个嵌套的
for并手动迭代会更容易(也更清晰)。 -
“在这种情况下,仅仅定义转换为 bool 是行不通的” - 为什么不呢?这正是
if语句所期望的。如果重载operator==以返回“比较类型”而不是bool,则该类型必须可转换为bool。见What are the basic rules and idioms for operator overloading?。在内部,您可以随意比较元素,只要最终结果可以表示为bool。如果您使用的是 C++20,请查看新的operator<=>,它更灵活。 -
不,您不能更改
if和else的含义来多次执行受控语句。你可以用不同的语法得到类似的东西,比如each_elem_if_else(a == b, [](const auto& x, const auto& y) { std::cout << x << " equals " << y << std::endl; }, [](const auto& x, const auto& y) { std::cout << x << " does not equal " << y << std::endl; }); -
@RemyLebeau 请注意,所需的结果包括执行一次 if 语句和执行 3 次 else 语句。
标签: c++ if-statement