2012-04-09 6 views
3

にテンプレートメンバ関数を渡すiは整数Nで鋳型タイプのセット、及びN < = KおよびN、すべてのタイプ> = 0を格納するクラス、テンプレート

template <int N> struct T { int i; } 

template <int N> struct TContainer{ 
    std::vector<T<N>> vec; 
    TContainer<N - 1> prev; 

    template <int target_n> TContainer<target_n> & get() { return prev.get(); } 
    template <> TContainer<N> & get<N>() { return *this; } 
}; 

template <> struct TContainer<0>{ 
    std::vector<T<N>> vec; 

    template <int target_n> TContainer<target_n> & get() { } 
    template <> TContainer<0> & get<0>() { return *this; } 
}; 

class ContainsAll{ 
    TContainer<K> my_data; 
    int my_instance_data; 
}; 
ようなものがあります

ContainsAllはforeach関数をいくつか持つことができます。これはテンプレートメンバー関数を使ってすべてのNに対して各要素を処理することができますか?

template<int N> 
void for_each(TContainer<N> & container, template_function){ 
    for(auto it = container.vec.begin(); it != container.vec.end(); ++it){ 
     template_function(*it); 
    } 
    for_each<K - 1>(container.prev, template_function); 
} 

template<> void for_each<0>(TContainer<0> & container, template_function){ 
    for(auto it = container.vec.begin(); it != container.vec.end(); ++it){ 
     template_function(*it); 
    } 
} 

ような何かだから私はあなたがテンプレート関数を渡すことはできません

template <int N> add_to_T(T<N> & in){ 
    in.i += my_instance_data; 
} 

for_each(my_container, add_to_T); 

答えて

2

を行うことができます。しかし、構造体のインスタンス(関数オブジェクト)を渡すことができます。このインスタンスにはテンプレート関数が含まれています。

template <typename F> 
void for_each(TContainer<0>& container, F f) 
{ 
    for (auto& t : container.vec) 
     f(t); 
} 

template <int N, typename F> 
void for_each(TContainer<N>& container, F f) 
{ 
    for (auto& t : container.vec) 
     f(t); 
    for_each(container.prev, std::move(f)); 
} 


struct TAdder { 
    template <int N> 
    void operator()(T<N>& t) const 
    { 
     t.i += N; 
    } 
}; 

for_each(c, TAdder{}); 
関連する問題