Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 默认模板类lambda_C++_Templates_Lambda - Fatal编程技术网

C++ 默认模板类lambda

C++ 默认模板类lambda,c++,templates,lambda,C++,Templates,Lambda,假设您有一个模板函数,它接受一个集合,可能还有一个转换lambda: template<typename Collection, typename Transform> void DoIt(const Collection &c, Transform transform) { for(auto &item: c) { std::cout << transform(item); } } 但如果没有,你可以打电话: D

假设您有一个模板函数,它接受一个集合,可能还有一个转换lambda:

template<typename Collection, typename Transform>
void DoIt(const Collection &c, Transform transform)
{
    for(auto &item: c)
    {
        std::cout << transform(item);
    }
}
但如果没有,你可以打电话:

DoIt(collection, [](const collection::value_type &item) { item.ToString();});

最简单的答案可能是重载函数,让一个调用另一个:

template<typename Collection, typename Transform>
void DoIt(const Collection &c, Transform transform)
{
    for(auto &item: c)
    {
        std::cout << transform(item);
    }
}

template<typename Collection>
void DoIt(const Collection &c)
{
    DoIt(c, [](auto &item) -> decltype(item) { return item; });
}
或者,如果出于某种原因,您确实只需要一个模板,那么您需要一个类似于类的函数,该类只需传递其参数

namespace std_compat {
    struct identity
    {
        template<typename T>
        constexpr T&& operator()(T&& obj) const noexcept
        { return std::forward<T>(obj); }

        using is_transparent = void;
    };
}

template<typename Collection, typename Transform = std_compat::identity>
void DoIt(const Collection &c, Transform transform = {})
{
    for(auto &item: c)
    {
        std::cout << transform(item);
    }
}
这也允许用户执行DoItc;之类的操作;。这似乎不是特别好或坏


注意:C++20中出现了一个问题。

最简单的答案可能是重载函数,让一个调用另一个:

template<typename Collection, typename Transform>
void DoIt(const Collection &c, Transform transform)
{
    for(auto &item: c)
    {
        std::cout << transform(item);
    }
}

template<typename Collection>
void DoIt(const Collection &c)
{
    DoIt(c, [](auto &item) -> decltype(item) { return item; });
}
或者,如果出于某种原因,您确实只需要一个模板,那么您需要一个类似于类的函数,该类只需传递其参数

namespace std_compat {
    struct identity
    {
        template<typename T>
        constexpr T&& operator()(T&& obj) const noexcept
        { return std::forward<T>(obj); }

        using is_transparent = void;
    };
}

template<typename Collection, typename Transform = std_compat::identity>
void DoIt(const Collection &c, Transform transform = {})
{
    for(auto &item: c)
    {
        std::cout << transform(item);
    }
}
这也允许用户执行DoItc;之类的操作;。这似乎不是特别好或坏


注意C++20中出现了问题。

您对这个特定的默认参数案例或一般的默认参数有问题吗?您对这个特定的默认参数案例或一般的默认参数有问题吗?非常好。我喜欢这两种解决方案。也许第二个更好,因为它更明确。非常好。我喜欢这两种解决方案。也许第二个更好,因为它更明确。