4

可変引数を持つジェネリック ラムダを返す関数を作成しようとしています。ラムダは、引数の 1 つが特定の値と等しいことを確認します。これが(大まかに)私がやろうとしていることです:

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...)auto、およびその他いくつかのことを試しましたがauto...、コンパイラ エラーが発生し続けます。これは可能ですか?

非ジェネリックに相当するものは次のようになります。

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);
    };
}

これは問題なく動作しますが、返されるラムダは一般的ではありません。任意のパラメーター パックでは動作しません。

4

2 に答える 2

8

std::make_tupleを使用するだけで、型について言及することを避けることができます。

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);
    };
}
于 2017-01-03T02:36:53.140 に答える
6

std::tuple テンプレート引数に何を入れればよいかわかりません。decltype(args)、decltype(args...)、auto、auto...、その他いくつか試しましたが、コンパイラ エラーが発生し続けます。

試してみてください

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);
    };
}
于 2017-01-03T02:30:32.807 に答える