CPP20 Introduction: New Operator <=>
Author: kagula
Date: 2-18-2023
Introduction
A concise description of how to use cpp20 new operator <=> by examples.
Environment & Dependencies
- Microsoft Visual Studio Community 2022 17.4.5
- Microsoft Unit Test Framework
- Change C++ Language Standard's default setting to ISO C++ 20 Standard in the new unit test project properties.
Content
Operator <=> is consist of operator <, operator ==, and operator > and it takes precedence over these comparison operators when they use together.
Operator <=> returns one of six possibles which are less, greater, equivalent (or equal), these prefixes with std::strong_ordering or std::partial_ordering, respectively.
TEST_METHOD(TestBetweenIntegerVariables)
{
int x = 1, y = 2;
Assert::IsTrue(x <=> y == std::strong_ordering::less);
Assert::IsTrue(x <=> 1.0 == std::partial_ordering::equivalent);
if (x <=> y == std::strong_ordering::equal == false)
{
//std::strong_ordering::equal's alias is std::strong_ordering::equivalent
Logger::WriteMessage("the variable x is not equal y.\n");
}
//In addition, all types of the C++ standard library that provide relational operators also provide operator<=>
Logger::WriteMessage("TestBetweenIntegerVariables is done.\n");
}
TEST_METHOD(TestBetweenObjects)
{
using namespace std;
class Person {
string _firstName;
string _lastName;//last name is sur name.
public:
Person(const string firstName, const string lastName)
{
_firstName = firstName, _lastName = lastName;
}
//I don't like using auto placeholder, so...
std::strong_ordering operator <=>(Person& rhs) const
{
auto cmp1 = _lastName <=> rhs._lastName; // primary member for ordering
if (cmp1 != 0) return cmp1;
return _firstName <=> rhs._firstName;
}
};
Person a("A","kagula"),b("B", "kagula");
if (a <=> b == std::strong_ordering::less)
{
Logger::WriteMessage("the object a is less than b.\n");
}
Logger::WriteMessage("TestBetweenObjects is done.\n");
}
Reference
- <<C++20 The Complete Guide>> First Edition by Josuttis N.