diff --git a/sum.cpp b/sum.cpp index efd1b27..b0268be 100644 --- a/sum.cpp +++ b/sum.cpp @@ -1,4 +1,5 @@ #include +#include #include using namespace std::string_literals; @@ -7,6 +8,37 @@ template auto sum(T final) { return final; } template auto sum(T first, Ts... rem) { return first + sum(rem...); } + +class ss_sum { + std::stringstream ss; + +public: + template ss_sum(T obj) : ss{} { ss << obj; } + ss_sum(ss_sum const &rhs) : ss{} { + std::string tmp; + const_cast(rhs).ss >> tmp; + const_cast(rhs).ss << tmp; + ss << tmp; + } + friend ss_sum operator+(ss_sum const &lhs, ss_sum const &rhs) { + ss_sum ret = lhs; + ss_sum tmp = rhs; + std::string a; + tmp.ss >> a; + ret.ss << a; + return ret; + } + friend bool operator==(ss_sum const &lhs, ss_sum const &rhs) { + ss_sum inner_l = lhs; + ss_sum inner_r = rhs; + std::string l; + std::string r; + inner_l.ss >> l; + inner_r.ss >> r; + return l == r; + } +}; + int main(void) { bool dummy = sum(1.5, 2, 3, 10) == 16.5; assert(dummy); @@ -17,4 +49,9 @@ int main(void) { dummy = sum("asdf"s, "abcdefghijklmnop"s, "qrstuvwxyz"s) == "asdfabcdefghijklmnopqrstuvwxyz"s; assert(dummy); + + // ss_sum is only associative when everything is ss_sum + auto tmp = sum(1, 2, 3); + dummy = tmp == ss_sum{"123"}; + assert(dummy); }