2016-10-12 15 views
8

タイプN回を展開:あなたは上記を参照することができたよう私は次のような問題持っているテンプレートパラメータ

template< std::size_t N > 
class A 
{ 
    std::function< std::size_t(/*std::size_t,....,std::size_t <- N-times*/) > foo; 
}; 

を、私はクラスAのメンバーとしてstd::function<...> fooを宣言してみてください。ここではfooに戻り値のタイプをstd::size_t(これは問題ありません)にして、入力としてNタイプの数値をstd::size_tに渡しますが、どのようにしたらよいかわかりません。可能性はありますか?

事前に感謝します。

答えて

12

あなたはstd::index_sequenceを使用することができます。

template<typename> 
struct AHelper; 

template<std::size_t... S> 
struct AHelper<std::index_sequence<S...>> { 
    std::function<std::size_t(decltype(S)...)> foo; 
}; 

template<std::size_t N> 
struct A : AHelper<std::make_index_sequence<N>> {}; 

Live example at coliru

あなたが好きなら、あなたはまた、拡大入力する内容に定義することができます。

template<typename, typename> 
struct AHelper; 

template<typename T, std::size_t... S> 
struct AHelper<T, std::index_sequence<S...>> { 
    template<std::size_t> 
    using type = T; 

    std::function<std::size_t(type<S>...)> foo; 
}; 

template<typename T, std::size_t N> 
struct A : AHelper<T, std::make_index_sequence<N>> {}; 
+1

優れたソリューションを。私よりもクリーナー。 – bolov

+0

定義を見つけるのに苦労している人のために: 'std :: index_sequence'は、 ''で定義されているヘルパーエイリアスです。[ヘルパーエイリアステンプレート\ [of '' std :: integer_sequence' \ 'std :: size_t'](http://en.cppreference.com/w/cpp/utility/integer_sequence#Helper_templates)です。" –

+0

そしてもう少し一般的には、make_type_wrapper = T;を使って 'template テンプレートを持つことができます。そのようにして、' size_t'以外のものを署名として使用したい場合は、 – SirGuy

1

これは楽しいことでした。ここに私の解決策は次のとおりです。

namespace details { 
template <size_t N, class F = size_t()> 
struct Function_type_helper {}; 

template <size_t N, class... Args> 
struct Function_type_helper<N, size_t(Args...)> { 
    using Type = typename Function_type_helper<N - 1, size_t(Args..., size_t)>::Type; 
}; 

template <class... Args> 
struct Function_type_helper<0, size_t(Args...)> { 
    using Type = size_t(Args...); 
}; 

template <size_t N, class F = size_t()> 
using Function_type_helper_t = typename Function_type_helper<N, F>::Type; 

static_assert(std::is_same_v<Function_type_helper_t<3>, size_t(size_t, size_t, size_t)>); 
} // ns details 

template<size_t N> 
struct A 
{ 
    std::function<details::Function_type_helper_t<N>> foo; 
}; 

これは再帰的にインスタンスのタイプにsize_t(size_t, size_t, ..., size_t)

を作成することで動作します。

H<3>::Type == H<3, size_t()>::Type == 
       H<2, size_t(size_t)>::Type == 
       H<1, size_t(size_t, size_t)>::Type == 
       H<0, size_t(size_t, size_t, size_t)>::Type == 
       size_t(size_t, size_t, size_t) 
2

任意の種類だけでなく、size_tについては、単にヘルパー別名書く:

template<class T, size_t> 
using Type = T; 

template<std::size_t... S> 
struct AHelper<std::index_sequence<S...>> { 
    std::function<size_t(Type<MyArbitraryTypeHere, S>...)> foo; 
}; 
関連する問題