7
It's great that you provide operator overloads, but it's also nice to have names - The Old New Thing
(devblogs.microsoft.com)
The center for all discussion and news regarding C++.
I feel that this is something that would be fixed by writing your test suites first. If you think you have designed a tremendously clever API, but then the code that calls it is an absolute mess, then you have not designed a tremendously clever API.
General principles of restraint and not having to use every available language feature all the time apply here as everywhere - keep it simple, stupid. The only WTF I want when reading your code is, "I didn't realise there could be such a straightforward way to do it".
I had designed a system with what I thought was a good API, wrote the test for it and I was satisfied how simple it was to use the thing but then, when it came to integrate it, it was clunky and no good way to actually use the system.
I don't think it's always obvious when an API is good or bad, even with tests.