1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | #include <cassert> #include <iostream> #include <string> // helper for result type template <typename T, typename Next> struct Cons; struct ConsEmpty; template <typename Cons, typename U> struct cons_result; template <typename U> struct cons_result<ConsEmpty, U> { typedef Cons<U, ConsEmpty> type; }; template <typename T, typename U> struct cons_result<Cons<T, ConsEmpty>, U> { typedef Cons<T, Cons<U, ConsEmpty> > type; }; template <typename T, typename Next, typename U> struct cons_result<Cons<T, Next>, U> { typedef Cons<T, typename cons_result<Next, U>::type> type; }; // define cons template <typename T, typename Next> struct Cons { Cons(T t, Next n): value(t), next(n) {} T value; Next next; template <typename U> typename cons_result<Cons, U>::type operator()(U u) { typedef typename cons_result<Cons, U>::type Result; return Result(value, next(u)); } }; struct ConsEmpty { template <typename U> Cons<U, ConsEmpty> operator()(U u) { return Cons<U, ConsEmpty>(u, ConsEmpty()); } }; template <typename T> Cons<T, ConsEmpty> cons(T t) { return Cons<T, ConsEmpty>(t, ConsEmpty()); } //And here is how you could design `VarPrint` for it: bool VarPrint(std::ostream& out, const std::string& s, ConsEmpty) { std::string::size_type offset = 0; if((offset = s.find("%")) != std::string::npos) { if(!(offset != s.size() - 1 && s[offset + 1] == '%')) { assert(!"Missing Arguments!"); return false; } } out << s; return true; } template<typename T, typename Next> bool VarPrint(std::ostream& out, std::string const& s, Cons<T, Next> const& cons) { std::string::size_type prev_offset = 0; std::string::size_type curr_offset = 0; while((curr_offset = s.find("%", prev_offset)) != std::string::npos) { out << s.substr(prev_offset, curr_offset); if(!(curr_offset != s.size() - 1 && s[curr_offset + 1] == '%')) { out << cons.value; if(curr_offset + 2 < s.length()) return VarPrint(out, s.substr(curr_offset + 2), cons.next); return true; } prev_offset = curr_offset + 2; if(prev_offset >= s.length()) break; } assert(!"Extra Argument Provided!"); return false; } // and the demo int main() { VarPrint(std::cout, "integer %i\n", cons(1)); VarPrint(std::cout, "mix of %i and %s\n", cons(2)("foo")); } |
I2luY2x1ZGUgPGNhc3NlcnQ+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KCi8vIGhlbHBlciBmb3IgcmVzdWx0IHR5cGUKCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgTmV4dD4gc3RydWN0IENvbnM7CiAgICBzdHJ1Y3QgQ29uc0VtcHR5OwoKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zLCB0eXBlbmFtZSBVPgogICAgc3RydWN0IGNvbnNfcmVzdWx0OwoKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgogICAgc3RydWN0IGNvbnNfcmVzdWx0PENvbnNFbXB0eSwgVT4gewogICAgICB0eXBlZGVmIENvbnM8VSwgQ29uc0VtcHR5PiB0eXBlOwogICAgfTsKCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KICAgIHN0cnVjdCBjb25zX3Jlc3VsdDxDb25zPFQsIENvbnNFbXB0eT4sIFU+IHsKICAgICAgdHlwZWRlZiBDb25zPFQsIENvbnM8VSwgQ29uc0VtcHR5PiA+IHR5cGU7CiAgICB9OwoKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBOZXh0LCB0eXBlbmFtZSBVPgogICAgc3RydWN0IGNvbnNfcmVzdWx0PENvbnM8VCwgTmV4dD4sIFU+IHsKICAgICAgdHlwZWRlZiBDb25zPFQsIHR5cGVuYW1lIGNvbnNfcmVzdWx0PE5leHQsIFU+Ojp0eXBlPiB0eXBlOwogICAgfTsKCiAgICAKLy8gZGVmaW5lIGNvbnMKCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgTmV4dD4KICAgIHN0cnVjdCBDb25zIHsKICAgICAgQ29ucyhUIHQsIE5leHQgbik6IHZhbHVlKHQpLCBuZXh0KG4pIHt9CgogICAgICBUIHZhbHVlOwogICAgICBOZXh0IG5leHQ7CgogICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KICAgICAgdHlwZW5hbWUgY29uc19yZXN1bHQ8Q29ucywgVT46OnR5cGUgb3BlcmF0b3IoKShVIHUpIHsKICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbnNfcmVzdWx0PENvbnMsIFU+Ojp0eXBlIFJlc3VsdDsKICAgICAgICByZXR1cm4gUmVzdWx0KHZhbHVlLCBuZXh0KHUpKTsKICAgICAgfQogICAgfTsKCiAgICBzdHJ1Y3QgQ29uc0VtcHR5IHsKICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CiAgICAgIENvbnM8VSwgQ29uc0VtcHR5PiBvcGVyYXRvcigpKFUgdSkgeyByZXR1cm4gQ29uczxVLCBDb25zRW1wdHk+KHUsIENvbnNFbXB0eSgpKTsgfQogICAgfTsKCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgIENvbnM8VCwgQ29uc0VtcHR5PiBjb25zKFQgdCkgeyByZXR1cm4gQ29uczxULCBDb25zRW1wdHk+KHQsIENvbnNFbXB0eSgpKTsgfQoKCi8vQW5kIGhlcmUgaXMgaG93IHlvdSBjb3VsZCBkZXNpZ24gYFZhclByaW50YCBmb3IgaXQ6CgogICAgYm9vbCBWYXJQcmludChzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3Qgc3RkOjpzdHJpbmcmIHMsIENvbnNFbXB0eSkgCiAgICB7CiAgICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBvZmZzZXQgPSAwOwogICAgICAgIGlmKChvZmZzZXQgPSBzLmZpbmQoIiUiKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpCiAgICAgICAgewogICAgICAgICAgICBpZighKG9mZnNldCAhPSBzLnNpemUoKSAtIDEgJiYgc1tvZmZzZXQgKyAxXSA9PSAnJScpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBhc3NlcnQoISJNaXNzaW5nIEFyZ3VtZW50cyEiKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBvdXQgPDwgczsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIAogICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgTmV4dD4KICAgIGJvb2wgVmFyUHJpbnQoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLAogICAgICAgICAgICAgICAgICBDb25zPFQsIE5leHQ+IGNvbnN0JiBjb25zKSAKICAgIHsKICAgICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHByZXZfb2Zmc2V0ID0gMDsKICAgICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGN1cnJfb2Zmc2V0ID0gMDsKICAgICAgICB3aGlsZSgoY3Vycl9vZmZzZXQgPSBzLmZpbmQoIiUiLCBwcmV2X29mZnNldCkpICE9IHN0ZDo6c3RyaW5nOjpucG9zKQogICAgICAgIHsKICAgICAgICAgICAgb3V0IDw8IHMuc3Vic3RyKHByZXZfb2Zmc2V0LCBjdXJyX29mZnNldCk7CiAgICAgICAgICAgIGlmKCEoY3Vycl9vZmZzZXQgIT0gcy5zaXplKCkgLSAxICYmIHNbY3Vycl9vZmZzZXQgKyAxXSA9PSAnJScpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvdXQgPDwgY29ucy52YWx1ZTsKICAgICAgICAgICAgICAgIGlmKGN1cnJfb2Zmc2V0ICsgMiA8IHMubGVuZ3RoKCkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZhclByaW50KG91dCwgcy5zdWJzdHIoY3Vycl9vZmZzZXQgKyAyKSwgY29ucy5uZXh0KTsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgcHJldl9vZmZzZXQgPSBjdXJyX29mZnNldCArIDI7CiAgICAgICAgICAgIGlmKHByZXZfb2Zmc2V0ID49IHMubGVuZ3RoKCkpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgYXNzZXJ0KCEiRXh0cmEgQXJndW1lbnQgUHJvdmlkZWQhIik7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKLy8gYW5kIHRoZSBkZW1vCgogICAgaW50IG1haW4oKSB7CiAgICAgIFZhclByaW50KHN0ZDo6Y291dCwgImludGVnZXIgJWlcbiIsIGNvbnMoMSkpOwogICAgICBWYXJQcmludChzdGQ6OmNvdXQsICJtaXggb2YgJWkgYW5kICVzXG4iLCBjb25zKDIpKCJmb28iKSk7CiAgICB9
-
upload with new input
-
result: Success time: 0s memory: 2860 kB returned value: 0
integer 1 mix of 2 and foo


