std::transform()
采用一元运算符,它运算某种类型T.它应该看起来像T f(T&)
。有时我们使用的函数不像boost::algorithm::to_lower()
那样返回void,并且是一个带有多个参数的类型(尽管其他参数是默认的)。我可以像这样转换boost::algorithm::to_lower()
struct tl {
template<typename T>
T operator()(T &v) const {
boost::algorithm::to_lower(v);
return v;
}
};
并使用此
tl low;
std::vector<...> vec;
...
std::transform(vec.begin(), vec.end(), vec.begin(), low);
我想做的是进一步概括这一步;让f()
成为一个带有T&
类型参数的函数,可能还有多个其他参数,这些参数必须具有默认值并返回任意类型(可能是T,可能是无效的,可能是别的,我们只是假设它作用于传递的referenc值。进一步f
本身可能是模板,因为boost :: algorithm :: to_lower()是。我想做一些人们可能期望的事情
tl<decltype f> low(f);
然后可以打电话
std::transform(vec.begin(), vec.end(), vec.begin(), low);
这样我就不会为每个想要转换的函数编写一个类。显然decltype(f)在这里不起作用。 C ++ 11是首选,但如果需要14或17,那就没关系。
答案 0 :(得分:4)
尝试以下宏:
if let _window = UIApplication.sharedApplication().delegate?.window, window = _window {
// Some code... i.e.
let frame = window.frame
}
你可以这样使用它:
#define MAKE_FUNCTIONAL( f ) []( auto x ){ f(x); return x; }
那就像魅力一样。 :)这需要C ++ 14,因为它使用带有auto参数的lambda。