2016-09-30 15 views
1

私は複数のストアドクラスのジェネリックキャッシュを必要とするプロジェクトに取り組んでいます。私の基底クラスは次のようになります。Variadicテンプレートクラス - 可変メンバー関数

template<typename ... Types> 
class VarCache{ 
    template<typename T> 
    using item_type = shared_ptr<holder<T>>; 
    template<typename T> 
    using map_type = map<int64_t,item_type <T>>; 
public: 
    std::tuple<map_type<Types>...> caches; 
}; 

私は引数を受け入れないだろう関数を記述する必要がありますが、キャッシュオブジェクト上で、それを呼び出すことによって、それが反復的に保存されたすべてのマップのバリアントを横断う、と(不要な項目を削除する)アクションをperfrom 。

例:

I VarCache<A,B,C> cacheTcache.prune_all_variants();を呼び出すことによって

A,B,Cの一つである方法prune<T>();私はキャッシュが

prune<A>(); 
prune<B>(); 
prune<C>(); 

実行したいが、この可能ですか?

答えて

2

パラメータパックの各要素に対して関数を呼び出すために使用できるトリックがいくつかあります。ここでは一つの選択肢だ:

あなたが使用すること
void prune_all_variants() { 
    (prune<Types>(), ...); 
} 
+0

ありがとうございました すばらしいです :)。 – semtexzv

1

void prune_all_variants() 
{ 
    int dummy[] = {0, (prune<Types>(), void(), 0)...}; 
    static_cast<void>(dummy); // avoid warning for unused variable. 
} 

かで倍発現とC++ 17では

void prune_all_variants() { 
    (void)std::initializer_list<int> { 
     (prune<Types>(), 0)... 
    }; 
} 

が、これはfold expressionsを使用して、次のように簡略化することができますC++ 17:

void prune_all_variants() { 
    (static_cast<void>(prune<Types>()), ...); 
} 
関連する問題