constexpr variantの限界:自分版
Variant
型安全Union
関数型風にいうと直和型
例えばVariant<int,double,string>であればint,double,stringの内どれかの値が入っている
複数の型のうちの一つを入れることができる型
variantはとても便利な機能だ。C++の標準にもこれと似たものを入れようという動きがある。それだけこの機能が求められているということであろう
それだけ求められているvariantである。やはりconstexprに対応させたい。させるべきである。そう考えるのは人間の道理である。
しかしこのクラスにはoperator=が実装されていない。実装できなかったのだ
variant a(3),b(string("ABC")); a=b;
このような時、プログラムはどのように動くべきであろうか
何らかの方法で3の値を安全に破棄し、『何らかの方法でstring()を構築して』ABCを代入する
と言ったところであろう
実行時であればplacement newを用いて3があったメモリ上にstringを構築するであろう
しかし、それはコンパイル時にはできないことなのだ。コンパイル時にnewを行うことはできない
故にstringを構築できず、故にoperator=を実装することができないのである
故に、完全なconstexpr variantを作ることができなかったのである。私は
さぁ、私でないあなた。今すぐC++を立ち上げよう。この問題を解決しよう