在C ++中将任意就地运算符转换为一元运算符

时间:2015-12-11 15:28:47

标签: c++ functor

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,那就没关系。

1 个答案:

答案 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。