PPAPタイピング
※ネタです
ツイッター等でPPAPを元ネタにしたネタコードをよく見るので、違う方向性で。ダックタイピングならぬ...。
#include<memory> #include<utility> #include<iostream> #include<string> #include<sstream> using namespace std::string_literals; const struct pen{ auto say()const{return "pen"s;} }P={}; const struct pineapple{ auto say()const{return "pineapple"s;} }P_={}; const struct apple{ auto say()const{return "apple"s;} }A={}; struct pikotaro{ struct ppap{ virtual std::string invoke()const=0; virtual ~ppap()=default; }; template<class T> struct ppap_:ppap{ explicit ppap_(const T& x):data(x){} std::string invoke()const override{return data.say();} private: T data; }; template<class T> pikotaro(T&& x):a(new ppap_<T>(std::forward<T>(x))){} auto say()const{return a->invoke();} private: std::shared_ptr<ppap> a; }; int main() { std::stringstream ss; ss<<pikotaro(P).say(); ss<<pikotaro(P_).say(); ss<<pikotaro(A).say(); ss<<pikotaro(P).say(); std::cout<<ss.str()<<std::endl; }
penpineappleapplepen
しかし、TypeErasureを現代っ子に教養として与えるのであれば、こういう方向性もアリなのではないだろうか。(迷走)