C++ 默认模板类lambda
假设您有一个模板函数,它接受一个集合,可能还有一个转换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
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中出现了问题。您对这个特定的默认参数案例或一般的默认参数有问题吗?您对这个特定的默认参数案例或一般的默认参数有问题吗?非常好。我喜欢这两种解决方案。也许第二个更好,因为它更明确。非常好。我喜欢这两种解决方案。也许第二个更好,因为它更明确。