#include <iostream>
#include <vector>
class C {
public:
void do_whatever() const {}
};
template<class T>
const T &apply_helper( const T *t ) { return *t; }
template<class T>
typename std::enable_if<!std::is_pointer<T>::value, const T &>::type
apply_helper( const T &t ) { return t; }
template<class T,typename Func>
void apply( const std::vector<T> &v, Func f )
{
for( const auto &i : v ) f( apply_helper( i ) );
}
int main() {
std::vector<C> vc;
std::vector<C*> vp;
auto call = []( const C &c ) { c.do_whatever(); };
apply( vc, call );
apply( vp, call );
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKY2xhc3MgQyB7CnB1YmxpYzoKICAgIHZvaWQgZG9fd2hhdGV2ZXIoKSBjb25zdCB7fQp9OwoKdGVtcGxhdGU8Y2xhc3MgVD4KY29uc3QgVCAmYXBwbHlfaGVscGVyKCBjb25zdCBUICp0ICkgeyByZXR1cm4gKnQ7IH0KCnRlbXBsYXRlPGNsYXNzIFQ+CnR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX3BvaW50ZXI8VD46OnZhbHVlLCBjb25zdCBUICY+Ojp0eXBlIAphcHBseV9oZWxwZXIoIGNvbnN0IFQgJnQgKSAgeyByZXR1cm4gdDsgfQoKCgp0ZW1wbGF0ZTxjbGFzcyBULHR5cGVuYW1lIEZ1bmM+CnZvaWQgYXBwbHkoIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZ2LCBGdW5jIGYgKQp7CiAgICBmb3IoIGNvbnN0IGF1dG8gJmkgOiB2ICkgZiggYXBwbHlfaGVscGVyKCBpICkgKTsKfQoKCgppbnQgbWFpbigpIHsKICAgIHN0ZDo6dmVjdG9yPEM+IHZjOwogICAgc3RkOjp2ZWN0b3I8Qyo+IHZwOwogICAgYXV0byBjYWxsID0gW10oIGNvbnN0IEMgJmMgKSB7IGMuZG9fd2hhdGV2ZXIoKTsgfTsKICAgIGFwcGx5KCB2YywgY2FsbCApOwogICAgYXBwbHkoIHZwLCBjYWxsICk7CiAgICByZXR1cm4gMDsKfQ==