コンパイル時にジャンプテーブルを作成し、実行時に使用するという考えで試しています。この場合、constexprデータ配列に任意のデータを格納
struct blah { constexpr blah() {} int operator()() const { return 42; }};
int fun(std::string const& str)
{
return switch_ {
case_{ "hello"_s, [](){ return 5; }
case_{ "blah"_s, blah{} }
}(str);
}
_s
はconstexpr stringです:それはそうのようなものを働くだろう。
これは、constexprハッシュ関数を使用してコンパイル時にハッシュテーブルを作成するという考えです。
私は例外を除いてすべての問題を解決していると思いますが、解決できない場合は実装できない可能性があります。それは初期化です。
ハッシュは配列で実装されます。衝突は、その配列内の空のセルに配置されます。したがって、私は、すべてのデータ型を単一の型として格納する方法を見つける必要があります。基本的なタイプの消去技術は動作していないようです。また、配置newを使用したり、値をバイトにキャストして配列にコピーすることはできません。また、一般に実行時に動作するが、constexprコンテキストでは許可されないユニオントリックを呼び出すUBを使用しようとしました。
利用できるように思われる唯一のオプションは、実際にはタプルのようなソートの組み合わせをレンダリングすることです。したがって、1つの値しか格納しませんが、ハッシュのすべての型のメモリを占有します。これは私には良くないようです。
誰かがconstexprで生成された配列に任意の型を格納する方法を考えることができますか?
私は、少なくとも私の狂った脳で、解決しようとしている問題を解決したと思います。私が実装を取得すると、私は投稿します。あなたがそれを見て興味がある場合は、こちらをご覧ください:https://github.com/crazy-eddie/experiments/constexpr-datastructures。まだインポートされていないのでリンクは失敗しますが、それが終わるところです。 –
https://github.com/crazy-eddie/experiments/tree/master/constexpr-datastructures –