X:私がやりたいこと:
私はタイプを持っています:BaseType
とDerivedType<int k>
(以下のコードを参照)、そしてK
派生タイプのベクトルのコレクションを処理する必要がありますstd::vector<DerivedType<k>>
、k = 1...K
。これらのベクトル内のオブジェクトにアクセスし、に依存する操作を実行したいと思いますk
。K
コンパイル時定数です。この問題は、実装で説明されています。
タイプは次のように定義されます。
#include <iostream>
#include <algorithm>
struct BaseType { // Interface of the DerivedTypes
virtual void print(){std::cout << "BaseType!" << std::endl; }
};
template< int k >
struct DerivedType : public BaseType {
static const int k_ = k;
// ... function calls templated on k ...
void print(){std::cout << "DerivedType: " << k_ << std::endl;}
};
template< int k >
void doSomething ( DerivedType<k>& object ) { object.print(); }
そして私がしたいのは:
int main() {
// My collection of vectors of the derived types:
std::vector<DerivedType<0>> derType0(2);
std::vector<DerivedType<1>> derType1(1);
std::vector<DerivedType<2>> derType2(3);
// ... should go to K: std::vector<DerivedType<K>> derTypeK;
// Iterate over the derived objects applying a k-dependent templated function:
std::for_each(begin(derType0),end(derType0),[](DerivedType<0>& object){
doSomething<0>(object);
});
std::for_each(begin(derType1),end(derType1),[](DerivedType<1>& object){
doSomething<1>(object);
});
std::for_each(begin(derType2),end(derType2),[](DerivedType<2>& object){
doSomething<2>(object);
});
return 0;
}
K
コンパイル時定数であるを変更するだけでよいように、コードを繰り返さないようにしたいO(10)
。理想的には、私はこの「もっと似た」ものを持っているでしょう:
// Pseudocode: do not try to compile this
create_derived_objects(DerivedType,K)
= std::vector< std::vector<DerivedType<k>>* > my_K_derived_types;
for each vector<DerivedType<k>>* derivedTypes in my my_K_derived_types
for each object in (*derivedTypes)
doSomething<k> on object of type derivedType<k>
// I could also restrict doSomething<k> to the base interface
派生型の各ベクトルには、オブジェクトが含まO(10^6)
れO(10^9)
ます。最も内側のループは、私のアプリケーションの中で最も時間のかかる部分であり、dynamic_castを最も外側のループのオプションのみにします。
Y:私が成功せずに試したこと。
私は現在、Abrahams C ++テンプレートメタプログラミングの本を勉強して、を使用できるかどうかを確認していますboost::mpl
。私もboost::fusion
それを使用できるかどうかを確認するためにチュートリアルを行っています。ただし、これらのライブラリの学習曲線はかなり大きいため、1週間投資する前に、より優れたシンプルなソリューションが利用できるかどうかを最初に尋ねたいと思いました。
私の最初の試みは、std::vector<DerivedType<k>>
を作成できるようにベクトルをラップし、ループvector<WrappedDerivedTypes*>
内で単一の各ベクトルに個別にアクセスすることでした。for_each
しかし、ループの中には、if(dynamic_cast<std::vector<DerivedType<0>>>(WrappedVector) != 0 ){ do for_each loop for the derived objects } else if( dynamic_cast...) { do...} ...
排除できなかった一連の問題があります。