Rokiのチラ裏

学生による学習のログ

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を現代っ子に教養として与えるのであれば、こういう方向性もアリなのではないだろうか。(迷走)