簡體   English   中英

在 C++ 模板中將類型傳遞給 Lambda 函數

[英]Passing Type Into Lambda Function In C++ Template

我正在嘗試在模板函數中使用std::transform 因為模板函數需要處理的類型多種多樣,所以關鍵部分是std::transform lambda 函數的設計。 我想傳遞可迭代T的基類型來構造一個 lambda 函數。 此處的實驗代碼使用typename std::iterator_traits<T::iterator>::value_type使用 gcc 10.2 和 MSVC 19.27 成功編譯,但使用 clang 失敗

我換了之后

typename std::iterator_traits<T::iterator>::value_type

進入

typename std::iterator_traits<typename T::iterator>::value_type

問題似乎解決了 但是,我不確定這是否是正確的用法。 此外,如果有任何其他更好的方法可以做到這一點,請告訴我。

template<typename T>
concept ElementSummable = requires(T x)
{
    x.at(0) + x.at(0);
};

template<typename T>
concept Iterable = requires(T x)
{
    x.begin();      // must have `x.begin()` 
    x.end();        // and `x.end()` 
};

template<class T> requires Iterable<T> && ElementSummable<T>
static T Foo(const T _input);

template<class T> requires Iterable<T> && ElementSummable<T>
static inline T Foo(const T _input)
{
    T returnObject = _input;
    std::transform(_input.begin(), _input.end(), returnObject.begin(),
        [](typename std::iterator_traits<T::iterator>::value_type element)->typename std::iterator_traits<T::iterator>::value_type
        {
            return element + 1;         //  For example
        }
    );
    return returnObject;
}

int main()
{
    long double number = 1;
    std::vector<decltype(number)> testVector1;
    testVector1.push_back(number);
    testVector1.push_back(number);

    std::cout << Foo(testVector1).at(0);
    return 0;
}

問題是CLang編譯器相對於標准的剛性。

問題不在於類型(這是正確的),問題在於您必須將 typename 放在依賴模板的類型之前。

然而,最好的解決方案是使用auto讓編譯器自己推斷類型。

暫無
暫無

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

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