#include<iostream>
using namespace std;
struct Add
{
template <typename A, typename B> A operator()(const A& lhs , const B& rhs)
{ return lhs+rhs; }
};
//some other ops
template <typename op, class A, class B >
A operate(A Fnum, B Snum){
op oper;
return oper(Fnum, Snum);
}
int main(){
int a = 20, b= 30;
std::cout<< operate<Add>(a,b)<<std::endl;
}
I2luY2x1ZGU8aW9zdHJlYW0+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IEFkZAp7CnRlbXBsYXRlIDx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPiBBIG9wZXJhdG9yKCkoY29uc3QgQSYgbGhzICwgY29uc3QgQiYgcmhzKQp7IHJldHVybiBsaHMrcmhzOyB9Cn07CgovL3NvbWUgb3RoZXIgb3BzCgp0ZW1wbGF0ZSA8dHlwZW5hbWUgb3AsIGNsYXNzIEEsIGNsYXNzIEIgPgpBIG9wZXJhdGUoQSBGbnVtLCBCIFNudW0pewpvcCBvcGVyOwpyZXR1cm4gb3BlcihGbnVtLCBTbnVtKTsKfQogCmludCBtYWluKCl7CmludCBhID0gMjAsIGI9IDMwOwpzdGQ6OmNvdXQ8PCBvcGVyYXRlPEFkZD4oYSxiKTw8c3RkOjplbmRsOwp9CiA=