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 | #include<iostream> #include<string> #include<type_traits> using std::string; using std::cerr; using std::endl; // base trait class stores data we want to access & modify in a uniform manner at runtime struct TraitBase{ string _name, _label; }; // template derived class stores data that are accessed at compile-time template<int _flags> struct Trait: public TraitBase{ // saves compile-time flags for easy access enum{flags=_flags}; // named parameter idiom; must be defined here (not in TraitBase) so that ref to ourselves is returned // in that way, chained expression retains template parameters Trait& name(const string& s){ _name=s; return *this; } Trait& label(const string& s){ _label=s; return *this; } }; struct Foo{ #define aTrait Trait<23>().name("a").label("[original label]") int a; static decltype(aTrait)& makeTrait_a(){ // remove reference in case named parameters are used in aTrait static std::remove_reference<decltype(aTrait)>::type _a=aTrait; return _a; } // we need std::remove_reference for decltype (otherwise error with gcc 4.5) // // this typedef also works around limited support for decltype in gcc-4.5; // e.g. std::remove_reference<decltype(Foo::makeTrait_a())>::type::flags would fail typedef std::remove_reference<decltype(Foo::makeTrait_a())>::type TraitType_a; }; template<int val> void printFlags(){ cerr<<"[compile-time flags "<<val<<"]\n"; } int main(void){ // show compile-time resolution printFlags<Foo::TraitType_a::flags>(); // show that static initialization works cerr<<Foo::makeTrait_a()._name<<": "<<Foo::makeTrait_a()._label<<endl; // show that reference to the single object is passed around properly Foo::makeTrait_a().label("[changed label]"); cerr<<Foo::makeTrait_a()._name<<": "<<Foo::makeTrait_a()._label<<endl; } |
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHN0cmluZz4KI2luY2x1ZGU8dHlwZV90cmFpdHM+CnVzaW5nIHN0ZDo6c3RyaW5nOwp1c2luZyBzdGQ6OmNlcnI7CnVzaW5nIHN0ZDo6ZW5kbDsKCi8vIGJhc2UgdHJhaXQgY2xhc3Mgc3RvcmVzIGRhdGEgd2Ugd2FudCB0byBhY2Nlc3MgJiBtb2RpZnkgaW4gYSB1bmlmb3JtIG1hbm5lciBhdCBydW50aW1lCnN0cnVjdCBUcmFpdEJhc2V7CglzdHJpbmcgX25hbWUsIF9sYWJlbDsKfTsKLy8gdGVtcGxhdGUgZGVyaXZlZCBjbGFzcyBzdG9yZXMgZGF0YSB0aGF0IGFyZSBhY2Nlc3NlZCBhdCBjb21waWxlLXRpbWUKdGVtcGxhdGU8aW50IF9mbGFncz4Kc3RydWN0IFRyYWl0OiBwdWJsaWMgVHJhaXRCYXNlewoJLy8gc2F2ZXMgY29tcGlsZS10aW1lIGZsYWdzIGZvciBlYXN5IGFjY2VzcwoJZW51bXtmbGFncz1fZmxhZ3N9OwoJLy8gbmFtZWQgcGFyYW1ldGVyIGlkaW9tOyBtdXN0IGJlIGRlZmluZWQgaGVyZSAobm90IGluIFRyYWl0QmFzZSkgc28gdGhhdCByZWYgdG8gb3Vyc2VsdmVzIGlzIHJldHVybmVkCgkvLyBpbiB0aGF0IHdheSwgY2hhaW5lZCBleHByZXNzaW9uIHJldGFpbnMgdGVtcGxhdGUgcGFyYW1ldGVycwoJVHJhaXQmIG5hbWUoY29uc3Qgc3RyaW5nJiBzKXsgX25hbWU9czsgcmV0dXJuICp0aGlzOyB9CglUcmFpdCYgbGFiZWwoY29uc3Qgc3RyaW5nJiBzKXsgX2xhYmVsPXM7IHJldHVybiAqdGhpczsgfQp9OwoKc3RydWN0IEZvb3sKCSNkZWZpbmUgYVRyYWl0IFRyYWl0PDIzPigpLm5hbWUoImEiKS5sYWJlbCgiW29yaWdpbmFsIGxhYmVsXSIpCglpbnQgYTsKCXN0YXRpYyBkZWNsdHlwZShhVHJhaXQpJiBtYWtlVHJhaXRfYSgpewoJCS8vIHJlbW92ZSByZWZlcmVuY2UgaW4gY2FzZSBuYW1lZCBwYXJhbWV0ZXJzIGFyZSB1c2VkIGluIGFUcmFpdAoJCXN0YXRpYyBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8ZGVjbHR5cGUoYVRyYWl0KT46OnR5cGUgX2E9YVRyYWl0OwoJCXJldHVybiBfYTsKCX0KCS8vIHdlIG5lZWQgc3RkOjpyZW1vdmVfcmVmZXJlbmNlIGZvciBkZWNsdHlwZSAob3RoZXJ3aXNlIGVycm9yIHdpdGggZ2NjIDQuNSkKCS8vCgkvLyB0aGlzIHR5cGVkZWYgYWxzbyB3b3JrcyBhcm91bmQgbGltaXRlZCBzdXBwb3J0IGZvciBkZWNsdHlwZSBpbiBnY2MtNC41OwoJLy8gZS5nLiBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8ZGVjbHR5cGUoRm9vOjptYWtlVHJhaXRfYSgpKT46OnR5cGU6OmZsYWdzIHdvdWxkIGZhaWwKCXR5cGVkZWYgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPGRlY2x0eXBlKEZvbzo6bWFrZVRyYWl0X2EoKSk+Ojp0eXBlIFRyYWl0VHlwZV9hOwp9OwoKdGVtcGxhdGU8aW50IHZhbD4gdm9pZCBwcmludEZsYWdzKCl7IGNlcnI8PCJbY29tcGlsZS10aW1lIGZsYWdzICI8PHZhbDw8Il1cbiI7IH0KCmludCBtYWluKHZvaWQpewoJLy8gc2hvdyBjb21waWxlLXRpbWUgcmVzb2x1dGlvbgoJcHJpbnRGbGFnczxGb286OlRyYWl0VHlwZV9hOjpmbGFncz4oKTsKCgkvLyBzaG93IHRoYXQgc3RhdGljIGluaXRpYWxpemF0aW9uIHdvcmtzCgljZXJyPDxGb286Om1ha2VUcmFpdF9hKCkuX25hbWU8PCI6ICI8PEZvbzo6bWFrZVRyYWl0X2EoKS5fbGFiZWw8PGVuZGw7CgoJLy8gc2hvdyB0aGF0IHJlZmVyZW5jZSB0byB0aGUgc2luZ2xlIG9iamVjdCBpcyBwYXNzZWQgYXJvdW5kIHByb3Blcmx5CglGb286Om1ha2VUcmFpdF9hKCkubGFiZWwoIltjaGFuZ2VkIGxhYmVsXSIpOwoJY2Vycjw8Rm9vOjptYWtlVHJhaXRfYSgpLl9uYW1lPDwiOiAiPDxGb286Om1ha2VUcmFpdF9hKCkuX2xhYmVsPDxlbmRsOwp9
-
upload with new input
-
result: Success time: 0s memory: 2960 kB returned value: 0
[compile-time flags 23] a: [original label] a: [changed label]


