2017-01-03 11 views
4

私は可変引数を持つgeneric lambdaを返す関数を書こうとしています。ラムダは引数の1つが特定の値と等しいことをチェックします。ここで私は何をしようとしている(おおよそ)です:汎用ラムダのvariadicパラメータパックから型を取得するには?

template <int Index, typename TValue> 
inline auto arg_eq(const TValue& value) 
{ 
    return [value] (auto... args) -> bool { 
     return (std::get<Index>(std::tuple</* ??? */>(args...)) == value); 
    }; 
} 

私はstd::tuple</* ??? */>テンプレート引数に入れてよく分かりません。私はdecltype(args)decltype(args...)autoauto...などいくつかのことを試しましたが、コンパイルエラーが続いています。これも可能ですか?

非ジェネリック同等のようなものになるだろう:これは正常に動作しますが、返されたラムダはジェネリックではありません

template <int Index, typename TValue, typename... TArgs> 
inline auto arg_eq(const TValue& value) 
{ 
    return [value] (TArgs... args) -> bool { 
     return (std::get<Index>(std::tuple<TArgs...>(args...)) == value); 
    }; 
} 

- それは、任意のパラメータパックでは動作しません。

答えて

5

私はstd :: tupleテンプレート引数に何を入れるべきか分かりません。私はdecltype(args)、decltype(args ...)、auto、auto ...を試してみましたが、他にもいくつかのことがありました。

あなたは単にstd::make_tupleを使用してタイプを言及避けることができ

std::tuple<decltype(args)...> 

フル機能

template <int Index, typename TValue> 
inline auto arg_eq(const TValue& value) 
{ 
    return [value] (auto... args) -> bool { 
     return (std::get<Index>(std::tuple<decltype(args)...>(args...)) 
       == value); 
    }; 
} 
7

で試してみてください:

template <int Index, typename TValue> 
auto arg_eq(const TValue& value) 
{ 
    return [value] (auto... args) -> bool { 
     return (std::get<Index>(std::make_tuple(args...)) == value); 
    }; 
} 
+2

か 'のstd :: tie'。 .. – Jarod42

関連する問題