gpt4 book ai didi

c++ - 默认模板类 lambda

转载 作者:行者123 更新时间:2023-11-30 00:43:20 24 4
gpt4 key购买 nike

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

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

但我想要一个 lambda 的默认转换,它只返回对其参数的引用。这样,如果 Collection::value_type 支持 << 到流中,您只需调用

DoIt(collection);

但如果没有,您可以调用:

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

这也允许用户执行类似 DoIt<decltype(c), std::negate<>>(c); 的操作.这似乎不是特别好或坏。

备注 std::identity 即将在 C++20 中推出。

关于c++ - 默认模板类 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55056952/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com