コード内の動的多型をかなり大きなクラスに置き換える必要があり、CRTP +可変テンプレート設計に問題があります。CRTP +可変テンプレートによる動的多型の模倣
説明すると、私は以下のおもちゃの問題を提供します。
次のインターフェイスが使用されているように、動的多型クラスがある:
int main() {
Loop loop;
Add add ;
loop.set(add);
loop.run();
Sub sub ;
loop.set(sub);
}
もちろん
、Sub
とAdd
がベースクラスOperation
とop(double & v)
から誘導されるが仮想メソッドです。
静的ポリモーフィズムにより、動的に変化させながら、私は、他の理由のために、このインターフェイスを維持する必要がある、これは今まで私のソリューションです:
template <typename T> class Operation {
public:
double d=1.;
void op(double & d) { static_cast<T*>(this)->op(d);}
};
class Add final: public Operation<Add> {
public: void op(double & v) { v += d; }
};
class Sub final: public Operation<Sub> {
public: void op(double & v) { v -= d; }
};
とLoop
クラスのため:
template <typename... Types>
class MetaLoop {
public:
double d = 0 ;
template <typename T> void set(T & t) {
std_cxx17::get<std::vector<T*> >(data).push_back(&t) ;
}
template <typename T> void run() {
for (auto j = 0; j<2E9 ; ++j)
std_cxx17::get<std::vector<T*> >(data).back()->op(d);
std::cout << d << std::endl;
}
private:
std::tuple<std::vector<Types*>... > data ;
};
typedef MetaLoop<Add,Sub> Loop ;
std_cxx17::get<T*>(data)
は、型によって要素をタプル単位で選択するメソッドへの呼び出しです。this post
このソリューションは、しかし、私はtypedef MetaLoop<Add,Sub> Loop
にほとんど私はrun()
にテンプレート引数を提供する必要性を除きたいインタフェース、すなわちrun<Add>
とrun<Sub>
とMetaLoop
からレジスタAdd
とSub
への必要性を考え必要ですそれが、マクロを使用せずに、可能であるかどうかを知りたい:
- が自動的
MetaLoop
にOperation<T>
クラスを登録します(つまり、自動的にtypedef Metaloop<...operations...>
と呼びます) run
メソッドにテンプレートクラスを指定しないでください。 (run<Add>()
の代わりにrun()
を呼び出してください)- このメソッドをライブラリから取得します。この種の多型性を静的に提供できるライブラリ(Boostなど)はありませんか?
私が使用できるいくつかの他のアーキテクチャがあることを認識していますが、他にも多くの制約があります。これは単なるおもちゃの問題です。
ありがとうございます!
EDIT 1:
質問2回答されています!ここを参照してください:http://coliru.stacked-crooked.com/a/e68ea7faabba3e40
賛辞をhttps://www.reddit.com/user/17b29a
「Add」を明示的に指定しないと、何が実行されると思いますか? 'Add'と' Sub'の両方を実行するべきでしょうか? – skypjack
私はそれが設定されている最後のタイプを実行することを期待しています。ありがとう! – Astor
だから、毎回アクティブなタイプが1つしかないと思っていますか?なぜ、すべてをベクターに保存するのですか? – skypjack