#include <iostream>
#include <map>
#include <utility>
using namespace std;
struct one {
void foo( const int ) { }
void bar( ) { }
} ;
struct two {
void foo( const int ) { }
} ;
struct three {
void foo( const int ) { }
void bar( ) { }
} ;
struct owner {
map< int , one> ones;
map< int , two> twos;
map< int , three> threes;
template < typename T, typename Func>
void callFunc( T& param, const Func& func) {
func( param) ;
}
template < typename T>
void findObject( int key, const T& func) {
if ( ones.count ( key) ! = 0U) {
callFunc( ones[ key] , func) ;
} else if ( twos.count ( key) ! = 0U) {
callFunc( twos[ key] , func) ;
} else {
callFunc( threes[ key] , func) ;
}
}
void foo( const int key, const int param) { findObject( key, [ & ] ( auto & value) { value.foo ( param) ; } ) ; }
void bar( const int key) { findObject( key, [ & ] ( auto & value) { value.bar ( ) ; } ) ; }
} ;
int main( ) {
owner myOwner;
myOwner.ones .insert ( make_pair( 0 , one( ) ) ) ;
myOwner.twos .insert ( make_pair( 1 , two( ) ) ) ;
myOwner.threes .insert ( make_pair( 2 , three( ) ) ) ;
myOwner.foo ( 2 , 1 ) ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8dXRpbGl0eT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3Qgb25lIHsKICAgIHZvaWQgZm9vKGNvbnN0IGludCkge30KICAgIHZvaWQgYmFyKCkge30KfTsKCnN0cnVjdCB0d28gewogICAgdm9pZCBmb28oY29uc3QgaW50KSB7fQp9OwoKc3RydWN0IHRocmVlIHsKICAgIHZvaWQgZm9vKGNvbnN0IGludCkge30KICAgIHZvaWQgYmFyKCkge30KfTsKCnN0cnVjdCBvd25lciB7CiAgICBtYXA8aW50LCBvbmU+IG9uZXM7CiAgICBtYXA8aW50LCB0d28+IHR3b3M7CiAgICBtYXA8aW50LCB0aHJlZT4gdGhyZWVzOwoKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBGdW5jPgogICAgdm9pZCBjYWxsRnVuYyhUJiBwYXJhbSwgY29uc3QgRnVuYyYgZnVuYykgewogICAgICAgIGZ1bmMocGFyYW0pOwogICAgfQoKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgdm9pZCBmaW5kT2JqZWN0KGludCBrZXksIGNvbnN0IFQmIGZ1bmMpIHsKICAgICAgICBpZihvbmVzLmNvdW50KGtleSkgIT0gMFUpIHsKICAgICAgICAgICAgY2FsbEZ1bmMob25lc1trZXldLCBmdW5jKTsKICAgICAgICB9IGVsc2UgaWYodHdvcy5jb3VudChrZXkpICE9IDBVKSB7CiAgICAgICAgICAgIGNhbGxGdW5jKHR3b3Nba2V5XSwgZnVuYyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY2FsbEZ1bmModGhyZWVzW2tleV0sIGZ1bmMpOwogICAgICAgIH0KICAgIH0KCiAgICB2b2lkIGZvbyhjb25zdCBpbnQga2V5LCBjb25zdCBpbnQgcGFyYW0pIHsgZmluZE9iamVjdChrZXksIFsmXShhdXRvJiB2YWx1ZSkgeyB2YWx1ZS5mb28ocGFyYW0pOyB9ICk7IH0KICAgIHZvaWQgYmFyKGNvbnN0IGludCBrZXkpIHsgZmluZE9iamVjdChrZXksIFsmXShhdXRvJiB2YWx1ZSkgeyB2YWx1ZS5iYXIoKTsgfSApOyB9Cn07CmludCBtYWluKCkgewoJb3duZXIgbXlPd25lcjsKCQoJbXlPd25lci5vbmVzLmluc2VydChtYWtlX3BhaXIoMCwgb25lKCkpKTsKCW15T3duZXIudHdvcy5pbnNlcnQobWFrZV9wYWlyKDEsIHR3bygpKSk7CglteU93bmVyLnRocmVlcy5pbnNlcnQobWFrZV9wYWlyKDIsIHRocmVlKCkpKTsKCQoJbXlPd25lci5mb28oMiwgMSk7Cn0=
compilation info
prog.cpp: In instantiation of ‘owner::bar(int)::<lambda(auto:2&)> [with auto:2 = two]’:
prog.cpp:28:13: required from ‘void owner::callFunc(T&, const Func&) [with T = two; Func = owner::bar(int)::<lambda(auto:2&)>]’
prog.cpp:36:13: required from ‘void owner::findObject(int, const T&) [with T = owner::bar(int)::<lambda(auto:2&)>]’
prog.cpp:43:81: required from here
prog.cpp:43:72: error: ‘struct two’ has no member named ‘bar’
void bar(const int key) { findObject(key, [&](auto& value) { value.bar(); } ); }
~~~~~~^~~
stdout