2017-04-22 3 views
3

タプルのようなものを使用する方法があるはな:: && autoに... argsを

template < typename ... Ts > 
struct Final { 

    constexpr Final(Ts && ... args) {} 
}; 

hana::unpack(foo, [] (auto && ... args) { return Final(args...); }); 

は、そのためのコードと、unpackはできませんラムダ/関数型を推定する。 基本的には、引数のリストを取る型を作成したいが、引数を含むタプルがある。

+0

そのコードは無効です。C++ 14またはC++ 17。あなたはコンセプトを使っていますか? –

+0

@KerrekSB私はここにコンセプトは必要ありません、あなたはなぜそれが無効であるのか教えてくれますか? –

+0

'auto'はC++の有効な関数型ではありません。これはラムダ式でのみ許可されています。 –

答えて

4

問題は、あなたのラムダである:

[](auto && ... args){ return Final(args...); } 
//       ~~~~~~~ 

Finalがタイプではない、それはクラステンプレートです。したがって、明示的に型を指定する必要があります。何かのように:

[](auto&&... args){ return Final<decltype(args)...>(
    std::forward<decltype(args)>(args)...); } 

C++ 17、クラスのテンプレートパラメータのテンプレート控除で、Ts&&は、転送リファレンス(related answerを参照)として機能していないので、暗黙の控除ガイドは、としてあなたの使用状況をとにかく一致しませんlvaluesのみを提供しており、ガイドには再評価が必要です。しかし、これは動作します:

[](auto... args){ return Final(std::move(args)...); } 
+1

おそらく、コンストラクタがTsによって値を取得し、ラムダの代わりに 'std :: move'を行った方が良いでしょう。 –

1

を私が正しくあなたの質問を理解していれば、あなたが実際に探していることは

template <typename ...Ts> 
struct Final { ... }; 

constexpr auto foo = hana::make_tuple(hana::type_c<Foo1>,hana::type_c<Foo2>); 
auto final_type = hana::unpack(foo, [](auto ...args) { 
    return Final<typename decltype(args)::type...>; 
}); 
// now, final_type is a hana::type<Final<Foo1, Foo2>> 

あなたはまたhana::template_を使用して同じことを達成することができます:

constexpr auto foo = hana::make_tuple(hana::type_c<Foo1>,hana::type_c<Foo2>); 
auto final_type = hana::unpack(foo, hana::template_<Final>); 

私がバリーの答えを見ると、Final<decltype(hana::type_c<Foo1>), decltype(hana::type_c<Foo2>)>を作成することになります。これはおそらくあなたが望むものではありません。

+0

私は以前の質問の影響を受けたと思っています。なぜなら私の目標はタプル型のタプルで最終的な型を作ることではないからです。よりコンテキストを必要とするなら、私はここでJason Riceのソリューションを使っていました。https://stackoverflow.com/questions/43089587/change-runtime-research-for-a-compile-time-oneと私はいくつかのmulti_mapに参加したいと思っていました。あなたの答えを誤解した^^ " –

+0

私が言っているのは、Barryの解法では、' unpack(foo、-ambda-he-provided) 'を実行すると' Foo –

+0

Barryの答えでは、OPの 'foo'が、あなたの問題を解決することができてうれしいです。 'hana :: type'のタプルです。 –

関連する問題