簡體   English   中英

如何從通用lambda中的variadic參數包中獲取類型?

[英]How to get types from variadic parameter pack in generic lambda?

我正在嘗試編寫一個函數,該函數將返回帶有可變參數的泛型lambda ,其中lambda檢查其中一個參數是否等於特定值。 這是(大致)我正在嘗試做的事情:

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</* ??? */>放什么std::tuple</* ??? */> 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);
    };
}

這工作正常,但返回的lambda不是通用的 - 它不適用於任何任意參數包。

您可以通過簡單地使用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);
    };
}

我不確定在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);
    };
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM