私は少し書く/ライブラリを最適化したいと思っています.2週間後、私は多少立ち往生しています。そのような可能性があります。 (私はメタプログラミングの経験はあまりありません)テンプレート - メタプログラミング、constexprまたはマクロを使用してコンパイル時にデータ構造を構築する
私の目標はもちろん、プログラマーがうまくいけばコードを編集する必要があるように、特定の計算をコンパイラで行うことですプログラムのある時点で、コンパイラにすべての定型文を「作成」させる。私はマクロを使って何をしたいのかを、どうやってどうやってできるか分かりやすく考えていますが、可能ならばテンプレートを使ってやりたいと思っています。
私の目標は 私は、使用しているプログラマが派生できるクラスがあると言います。そこには、基本クラスがそれらに対して操作を行うことができるように、何らかの方法で登録したい複数の着信および発信データ型を持つことができます。
class my_own_multiply : function_base {
in<int> a;
in<float> b;
out<double> c;
// ["..."] // other content of the class that actually does something but is irrelevant
register_ins<a, b> ins_of_function; // example meta-function calls
register_outs<c> outs_of_function;
}
私が今まで持っていたメタコードはこれです:(しかし、それは完全なジェット作業/ではありません)
template <typename... Ts>
struct register_ins {
const std::array<std::unique_ptr<in_type_erasured>, sizeof...(Ts)> ins;
constexpr std::array<std::unique_ptr<in_type_erasured>, sizeof...(Ts)>
build_ins_array() {
std::array<std::unique_ptr<in_type_erasured>, sizeof...(Ts)> ins_build;
for (unsigned int i = 0; i < sizeof...(Ts); ++i) {
ins_build[i] = std::make_unique<in_type_erasured>();
}
return ins_build;
}
constexpr register_ins() : ins(build_ins_array()) {
}
template <typename T>
T getValueOf(unsigned int in_nr) {
return ins[in_nr]->getValue();
}
};
ご覧の通り、私は私のメタテンプレートコードを呼び出したいですさまざまな数のインがあります。 (プログラマーが多くの人を好きに置くことができるという感覚で可変ですが、実行時には変更されないため、コンパイル時に "焼き付け"できます)
メタコードは作成中配列の長さはinsの数であり、すべてのフィールドがmy_own_multiplyクラスの元の値を指すように初期化されます。基本的には常に正しいサイズを持つ索引付け可能なデータ構造を与えます。そして、私はfunction_baseクラスからアクセスして、特定の関数のためにすべての関数を使用することができます。
私はこれをどうやって行うのか見てきましたが、コンパイル時にこの配列を "作成"することが実際には許されないかもしれないという気持ちが現れています。私はそれらを突然変異させることができるように、非静的で非constである。私の側からは、とにかくコンスタントである必要はありませんでしたが、私の作者は、彼らが自由であることを好まないようです。 constが必要なのは、ポインタを持つ配列だけです。しかし、おそらくconstexprを使うことで、私はそれらをconstにすることができますか?
私は何を得られないのかを明確にします: 私はメタスタッフ構造の "インスタンス"を作成しようとしていますが、それはすべての種類のconst、constexprなどを期待するため失敗します。 。しかし、私はそれらの変数の大部分を変異させる必要があるので、私はそれらを望んでいません。コンパイル時にすでに正しいサイズの配列を作成するには、このメタデータだけが必要です。しかし、私はこれを実現するためにすべてを静的にしなければならないことを犠牲にしたくない。このような言葉の下でもこれは可能ですか?
あなたが欲しいものを理解しようとする問題。私はあなたが他のメタプログラミングライブラリーについて最初に学ぶ方が良いと思う。ブースト。つまり、「タイプ消去された」ものは間違っているようだ。なぜあなたはそれを気にしていますか?私は 'std :: array'ではなく' std :: tuple'を見ることを期待しています。 – MSalters
タイプ消しゴムは今のところはうっ血だから、私はそれが怪しいように見えるのではない。重要なのは、私が最後に基本クラスからアクセスできるデータ構造を作成する部分です。 タプルが必要なのは何ですか?なぜそれを期待していますか? – Andimanos
どのバージョンのC++を使用できますか? C++ 14以降であれば、 'constexpr'を持つ関数は読みやすく、保守が容易なコンパイル時の計算を提供することができます(旧形式のテンプレートメタプログラミングの一部を置き換える)。興味があれば、私は答えとして例を用意することができます。 – Julius