【发布时间】:2018-08-24 19:59:20
【问题描述】:
namespace detail
{
template <typename T, typename U>
Array<U> extract_(const Array<T>& array, std::function<U(const T&)> member)
{
Array<U> extracted;
for (auto& item : array)
extracted += member(item);
return extracted;
}
}
#define extract(container, member) detail::extract_(container, \
std::function< typeof(typeof(container)::Type::element_type::member) (const typeof(container)::Type&)>( \
[&](const typeof(container)::Type& item){ return item->member; }))
这就是我想用来从数组中提取成员的算法。 Array<T> 是我自己开发的数组类型,它处理出价。
如果你对宏过敏,很抱歉,但它使用户代码非常干净。
我想要做的是,如果我有Array<Size> sizeArray 和成员double Array<Size>::Length,能够说auto lengths = extract(sizeArray, Length); 并且lengths 是Array<double> 类型。
我已经做了类似的事情
namespace detail
{
template <typename T>
Array<T> filter_(const Array<T>& array, std::function<bool(const T&)> condition)
{
Array<T> filtered;
for (auto& item : array)
if (condition(item)) filtered += item;
return filtered;
}
}
// this macro creates a capturing lambda, the item to check is called 'item'
#define filter(container, condition) detail::filter_(container, \
std::function<bool(const typeof(container)::Type&)>( \
[&](const typeof(container)::Type& item){ return condition; }))
我可以使用auto turnedOff = filter(objects, !item->IsTurnedOn);,它运行良好,但它返回相同的类型,因此更容易解决。
【问题讨论】:
-
什么是“出价”?并且“如果你对宏过敏,对不起,但它使用户代码非常干净” - 不。
-
@NeilButterworth:也许它的意思是说“生意”?如,“我可以处理我的出价”。
-
那么问题是什么?另外,我建议
decltype而不是typeof。 -
既然您至少可以访问 C++11,为什么不使用
decltype? -
看起来您正在尝试制作
std::copy_if的“范围”版本
标签: c++ arrays templates preprocessor