2011-01-12 6 views
0

私はその型の名前に依存する型のタプルを作成したいと思います。どのようにしてタプルの型名に依存するブーストタプルを作成できますか?

多分例は私の問題を明確にします:

//T would be boost::tuples::tuple<int, int, ...> 
template <typename T> 
T generate() 
{ 
    typedef T GT; 
    typedef boost::tuples::element<0,GT>::type tt0; 
    typedef boost::tuples::element<1,GT>::type tt1; 
    typedef boost::tuples::element<2,GT>::type tt2; 
    if(tt3==null_type) 
     return boost::tuples::make_tuple<tt0,tt1>(static_cast<tt0>(1), static_cast<tt1>(2)); 
    else 
     return boost::tuples::make_tuple<tt0, tt1, tt2>(static_cast<tt0>(1), static_cast<tt1>(2), ...); 
} 

編集:私は良い方法を見つけた 、テンプレート再帰。 問題が解決しました。

+0

そして、それらのエラーがありますか...? –

+0

'typename'のより自由なアプリケーションは、あなたが望むものを得ることができます。 –

+0

@Noah「より自由なtypenameの適用」という言葉を正確にどういう意味ですか? – bua

答えて

2
typedef typename oost::tuples::element<0,GT>::type tt0; 

...

if(tt3==null_type) 

あなたはタイプをチェックカントこれを気に入って、代わりに

 return boost::tuples::make_tuple<tt0,tt1>(static_cast<tt0>(1), static_cast<tt1>(2)); 
    else 
     return boost::tuples::make_tuple<tt0, tt1, tt2>(static_cast<tt0>(1), static_cast<tt1>(2), ...); 

mpl::if_を使用しますnull_typeを削除しようとしていますか?ちょうどboost::fusion::removeを使用してください。他のケースのための

template <typename T> 
tuple<tt0,tt1> 
generate(typename enable_if<is_same<tt3, null_type> >::type* = 0) { 
    typedef typename boost::tuples::element<0,T>::type tt0; 
    typedef typename boost::tuples::element<1,T>::type tt1; 
    return make_tuple(tt0(1), tt1(1)); 
} 

similary:ここ

は別のソリューションです。

予告:boost::enable_ifboost::is_same

+0

'if'は問題ではないので、どちらかを削除してください。 タプルモデルに応じてタプルを作成したいだけです。 – bua

+0

@bua if文を使用して型を比較す​​ることはできません。例えば、 'int == double'は間違っています。アップデートを参照してください。 – Anycorn

+0

はい、私は理解していますが、これはまったくcomparsionではないので、この関数を使用すると、この関数を呼び出すことができます。 – bua

関連する問題