C++ 1x标准已弃用旧的STL绑定器功能,而更为通用std::bind.但是,似乎std::not1并且std::not2不赞成普遍std::not_或某种东西.实际情况是<functional>,在C++ 1x之前,STL 的部分由于1)缺少lambdas而非常麻烦,2)绑定器和否定函数需要嵌套的typedef argument_type,这意味着它们无法使用使用普通函数,以及3)缺少可变参数模板需要单独的绑定和否定函数,具体取决于参数的数量.
C++ 1x改变了所有这一切,大大提高了它的实用性<functional>.但出于某种原因,C++ 1x似乎已经改进了除了 std::not1和之外的一切std::not2.真的,有一个标准的通用negate功能会很好,比如:
template <class F>
class negation
{
public:
negation(F f) : m_functor(f) { }
template <class... Args>
bool operator() (Args&&... args) const
{
return (!m_functor(args...));
}
private:
F m_functor;
};
template <class F>
inline negation<F> not_(F f)
{
return negation<F>(f);
}
Run Code Online (Sandbox Code Playgroud)
这当然会被弃用,std::not1并且std::not2旧的绑定器也会被弃用.
问题: 1)我查看了C++ 1x草案,并没有看到任何提及通用negate功能.我错过了吗?2)是否有一些令人信服的理由为什么他们添加了通用bind并弃用了旧的绑定器,但是对于否定函数却没有做同样的事情?
你没有错过它.
有说服力的理由?这取决于你问谁.讨论了缺乏此功能,但直到此过程很晚才讨论.嗯......我现在找不到文书工作,可能没有.
对此(imho)的最佳解决方案是添加operator!()来绑定.但到了这个时候,委员会没有心情为C++ 11添加新功能.也许它会出现在技术报告中.
哦,这是文书工作:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3224.html#gb97