Faheem Mithaというユーザーの下のコードは、このユーザーのJohannes Schaub - litbの回答をSOに基づいています。このコードは、tuple
のパラメータパックへの変換である私が求めていることを完全に行いますが、私はこのコードを十分に理解していないので、私のようなテンプレートのメタプログラミングを助けるかもしれない新しい議論を作成すると考えました。だから、重複投稿をご容赦ください。今すぐコードタプルからパラメータパック
#include <tuple>
#include <iostream>
using std::cout;
using std::endl;
template<int ...> struct seq {};
template<int N, int ...S> struct gens : gens<N - 1, N - 1, S...> { };
template<int ...S> struct gens<0, S...>{ typedef seq<S...> type; };
double foo(int x, float y, double z)
{
return x + y + z;
}
template <typename ...Args>
struct save_it_for_later
{
std::tuple<Args...> params;
double(*func)(Args...);
double delayed_dispatch()
{
return callFunc(typename gens<sizeof...(Args)>::type()); // Item #1
}
template<int ...S>
double callFunc(seq<S...>)
{
return func(std::get<S>(params) ...);
}
};
int main(void)
{
std::tuple<int, float, double> t = std::make_tuple(1, (float)1.2, 5);
save_it_for_later<int, float, double> saved = { t, foo };
cout << saved.delayed_dispatch() << endl;
return 0;
}
上に移動
は、私は完全に上記のアイテム#1によって混乱しています:
typename
は、その行にどのような目的を果たしていますか?gens<sizeof...(Args)>::type()
はgens<3>::type()
に拡張されますが、それはtemplate<int N, int ...S> struct gens : gens<N - 1, N - 1, S...> { };
でもtemplate<int ...S> struct gens<0, S...>
でも一致しません。私は明らかにその点を見逃しています。誰かがここで何が起きているのかを説明できると嬉しいです。
私はcallFunc
は、このフォームcallFunc(seq<0,1,2>)
で呼び出されると、この方法自体のreturn文がreturn func(std::get<0>(params), std::get<1>(params), std::get<2>(params)
に展開し、これは、このスキームの仕事を作るものですが、私はこのseq<0,1,2>
型が生成される方法をトレーニングできないことを理解してください。
注:std::index_sequence_for
を使用することはできません。私のコンパイラはC++ 14の機能をサポートしていません。
PS:このテクニックをテンプレートメタプログラミングと分類できますか?
1) 'gens :: type'はメンバ関数ではなく、型であることをコンパイラに知らせるためです。 2)パラメーターパックを空にすることができます。 –
'gens <3>'は 'template struct gens'と一致しません。' N == 3'と 'S'は空のパックです。 –
基本的に 'seq'は' 'std :: index_sequence'(http://en.cppreference.com/w/cpp/utility/integer_sequence)で、' gens'は 'std :: make_index_sequence'です –