#include <functional>
#include <iostream>
template < typename T, typename Setter>
class Option
{
public :
Option( )
: setter_( Setter)
{
}
/* operator= to be done, ruft dann setter mit value_ als value-Parameter auf */
/* noch irgendwas, um intValue_ oder doubleValue_ direkt verwenden zu können */
private :
T value_;
std:: function < bool ( const T & source, T & value) > setter_;
} ;
class SomeClass
{
public :
void Blub( )
{
intValue_ = 20 ;
doubleValue_ = 4.2 ;
}
void HighlyFrequentedFunction( )
{
std:: cout << "Result is: " << ( intValue_ * doubleValue_) << "\n " ;
}
private :
Option< int , [ ] ( const int & source, int & value) - > bool {
value = source;
return true ;
} > intValue_;
Option< double , [ ] ( const double & source, double & value) - > bool {
if ( source < 2.0 || source > 5.0 ) return false ;
value = source * 2 ;
return true ;
} > doubleValue_;
} ;
int mai( int argc, char * argv[ ] )
{
SomeClass test;
test.Blub ( ) ;
for ( int i = 0 ; i < 20 ; ++ i) test.HighlyFrequentedFunction ( ) ;
return 0 ;
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFNldHRlcj4KY2xhc3MgT3B0aW9uCnsKcHVibGljOgogICAgT3B0aW9uKCkKCQk6IHNldHRlcl8oU2V0dGVyKQoJewoJfQoKCS8qIG9wZXJhdG9yPSB0byBiZSBkb25lLCBydWZ0IGRhbm4gc2V0dGVyIG1pdCB2YWx1ZV8gYWxzIHZhbHVlLVBhcmFtZXRlciBhdWYgKi8KCS8qIG5vY2ggaXJnZW5kd2FzLCB1bSBpbnRWYWx1ZV8gb2RlciBkb3VibGVWYWx1ZV8gZGlyZWt0IHZlcndlbmRlbiB6dSBrw7ZubmVuICovCgpwcml2YXRlOgoJVCB2YWx1ZV87CglzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgVCAmc291cmNlLCBUICZ2YWx1ZSk+IHNldHRlcl87Cn07CgpjbGFzcyBTb21lQ2xhc3MKewpwdWJsaWM6Cgl2b2lkIEJsdWIoKQoJewoJCWludFZhbHVlXyA9IDIwOwoJCWRvdWJsZVZhbHVlXyA9IDQuMjsKCX0KCgl2b2lkIEhpZ2hseUZyZXF1ZW50ZWRGdW5jdGlvbigpCgl7CgkJc3RkOjpjb3V0IDw8ICJSZXN1bHQgaXM6ICIgPDwgKGludFZhbHVlXyAqIGRvdWJsZVZhbHVlXykgPDwgIlxuIjsKCX0KCnByaXZhdGU6CglPcHRpb248aW50LCBbXSAoY29uc3QgaW50ICZzb3VyY2UsIGludCAmdmFsdWUpIC0+IGJvb2wgewoJCXZhbHVlID0gc291cmNlOwoJCXJldHVybiB0cnVlOwoJfT4gaW50VmFsdWVfOwoJCglPcHRpb248ZG91YmxlLCBbXSAoY29uc3QgZG91YmxlICZzb3VyY2UsIGRvdWJsZSAmdmFsdWUpIC0+IGJvb2wgewoJCWlmIChzb3VyY2UgPCAyLjAgfHwgc291cmNlID4gNS4wKSByZXR1cm4gZmFsc2U7CgkJdmFsdWUgPSBzb3VyY2UgKiAyOwoJCXJldHVybiB0cnVlOwoJfT4gZG91YmxlVmFsdWVfOwp9OwoKaW50IG1haShpbnQgYXJnYywgY2hhciAqYXJndltdKQp7CglTb21lQ2xhc3MgdGVzdDsKCXRlc3QuQmx1YigpOwoKCWZvciAoaW50IGkgPSAwOyBpIDwgMjA7ICsraSkgdGVzdC5IaWdobHlGcmVxdWVudGVkRnVuY3Rpb24oKTsKCglyZXR1cm4gMDsKfQ==
compilation info
prog.cpp: In constructor ‘Option<T, Setter>::Option()’:
prog.cpp:9:19: error: expected primary-expression before ‘)’ token
prog.cpp: At global scope:
prog.cpp:39:3: error: type/value mismatch at argument 2 in template parameter list for ‘template<class T, class Setter> class Option’
prog.cpp:39:3: error: expected a type, got ‘<lambda closure object><lambda(const int&, int&)>{}’
prog.cpp:45:3: error: template argument 2 is invalid
stdout