ネストしたテンプレートパラメータを平坦化する方法

私が持っていると言う

template pack { };

変換したい

pack>>>

pack

どうすればいいの?

0
nl ru de
pack 、int> のようなものも変換しますか?
追加された 著者 Holt,

4 答え

私は次のような構造体を使って提案します

template 
struct flatt_helper
 { using type = T0; };

template 
struct flatt_helper, T0, Ts2...>
   : flatt_helper, Ts2...>
 { };

template  class C, 
          typename ... Ts2, typename ... Ts3>
struct flatt_helper, C, Ts3...>
   : flatt_helper, Ts2..., Ts3...>
 { };

template 
using flatt = typename flatt_helper, T>::type;

This way you can flatten pack and other template-template, as std::tuple, and also more complex examples (the pack, int> suggested by Holt, by example).

pack だけをフラットにしたいのなら、すべてのtemplate-templateがフラットにならないようにしてください。

pack>>

平らにされている

pack>

の代わりに

pack

最後の flatt_helper スペシャライゼーションでtemplate-templateパラメータを削除し、次のように単純化する必要があります

template 
struct flatt_helper, pack, Ts3...>
   : flatt_helper, Ts2..., Ts3...>
 { };

以下は完全コンパイルの例です(完全フラット化)。

#include 
#include 

template 
struct pack
 { };

template 
struct flatt_helper
 { using type = T0; };

template 
struct flatt_helper, T0, Ts2...>
   : flatt_helper, Ts2...>
 { };

template  class C, 
          typename ... Ts2, typename ... Ts3>
struct flatt_helper, C, Ts3...>
   : flatt_helper, Ts2..., Ts3...>
 { };

template 
using flatt = typename flatt_helper, T>::type;

int main()
 {
   using T0 = pack>>>;
   using T1 = pack;
   using T2 = flatt;
   using T3 = pack, std::tuple, long>>;
   using T4 = pack;
   using T5 = flatt;

   static_assert( std::is_same::value, "!" );
   static_assert( std::is_same::value, "!" );
 }
2
追加された
私はそれを「間違っている」とさえ呼ぶでしょう。
追加された 著者 Yakk - Adam Nevraumont,
@Holt - はい、わかりませんでした。回答が修正されました。希望はより明確になりました
追加された 著者 max66,
pack <> から構築するのにいい答えですが、テンプレートテンプレートパラメータを使用すると、 flatt <�のようにすべてがフラットになります。 int >>> は実際には pack なので、ここでは期待される動作ではないかもしれません。
追加された 著者 Holt,

私は再帰的にアンパックして物を戻します。

template
struct repack
{
    using type = Head;
};

template
struct repack>>
{
    using type = pack
>; }; 

The type repack>>>>::type get transformed into:

  • pack>>>>
  • pack>>>
  • pack>>
  • pack

ライブデモ

1
追加された
このコードはあなたがそれがすると思うタイプを生成しません。 `pack rightも扱っていません。
追加された 著者 Yakk - Adam Nevraumont,

pack_cat takes a sequence of packs or non-packs, and concatinates anything that is a pack together, plus items that are not packs.

template
struct catter;
template
using pack_cat = typename catter::type;
template
struct catter{ using type=T0; };
template
struct catter, pack, Vs...>{ using type=pack_cat,Vs...>; };
template
struct catter, U, Vs...>{ using type=pack_cat,Vs...>; };

unpacker takes a pack, and recursively unpacks all sub-packs and concatinates them.

template
struct unpacker{using type=X;};
template
using unpack=typename unpacker::type;
template
struct unpacker>{using type=pack_cat,unpack...>;};

それをテストするには:

pack{}=unpack>>>>{};
pack{} = unpack>{};
pack{} = unpack,int>>{};

どちらのIFFをコンパイルするかは2つのタイプは同じです。

0
追加された