私は以前にこれを解決したことを知っていますが、その方法を思い出せません。まあ、これが新鮮な外観です。
数列は、を使用して引数シーケンスに変換できるstd::get
ため、より基本的です。したがって、ある種のカスタムツールを実装する必要があると仮定すると、ナンバーパックジェネレーターは良い選択のように思えます。
(ああ、これは信じられないほど退屈でした。ハワードの答えを覗いて学んだのですforward_as_tuple
が、その関数は私のコンパイラーやideone.comにもまだ存在していないので、何とか。まだまっすぐにする必要があることがたくさんあります。 、そしてこれは確かにこれまでに発明された中で最悪の関数型言語の1つです。)
http://ideone.com/u5noV
#include <tuple>
// Generic pack array (metacontainer)
template< typename T, T ... seq > struct value_sequence {
// Append a value to the array (metafunction)
template< T val > struct append
{ typedef value_sequence< T, seq..., val > type; };
};
// Generate a sequential array (metafunction)
template< size_t N >
struct index_sequence {
typedef typename index_sequence< N - 1 >::type
::template append< N - 1 >::type type;
};
template<>
struct index_sequence< 0 >
{ typedef value_sequence< size_t > type; };
// Generate indexes up to size of given tuple (metafunction)
template< typename T >
struct index_tuple {
typedef typename index_sequence< std::tuple_size< T >::value
>::type type;
};
// The magic function: passes indexes, makes all the function calls
template< typename F, typename G,
typename T, size_t ... N >
void compose_with_indexes_helper( F f, G g, T args,
value_sequence< size_t, N ... > ) {
f( g( std::get< N >( args ), N ) ... );
}
template< typename F, typename G, typename ... T >
void compose_with_indexes( F f, G g, T && ... args ) {
typedef std::tuple< T && ... > tuple_t;
compose_with_indexes_helper
// forwarding seems broken on ideone.com/GCC 4.5.1, work around.
// ( f, g, std::forward_as_tuple( std::forward( args ) ... ) );
( f, g, tuple_t( args ... ), typename index_tuple< tuple_t >::type() );
}