C++(0x) 中是不是存在无操作“啥都不做”函数对象?

Posted

技术标签:

【中文标题】C++(0x) 中是不是存在无操作“啥都不做”函数对象?【英文标题】:Does a no-op "do nothing" function object exist in C++(0x)?C++(0x) 中是否存在无操作“什么都不做”函数对象? 【发布时间】:2011-02-28 06:47:07 【问题描述】:

我意识到这是一个可笑的问题,因为它需要不到 2 秒的时间来实现。但我依稀记得读过新标准引入了一个。

我对 VC10 的标题进行了 grep 处理,但一无所获。你能帮我吗?烦死我了! :)

编辑: 转念一想,我记得的新仿函数可能是不相关的std::default_deleter

【问题讨论】:

多么浪费 AirMiles 积分。想象一下,如果这不是一个 CW 问题,您可以节省多少! 【参考方案1】:

你总是可以写一个无操作的 lambda:[]

【讨论】:

我喜欢这个,但它不适用于我散布的std::conditional 的数量。一个空的std::function 将抛出 operator()。 是的,但每个[] 都是不同的类型。我可以看到为 no-op 函数使用单一名称的几个优点。【参考方案2】:

在我期望函子不返回任何值的情况下,我将其用作插入式无操作。

struct VoidNoOp 
    void operator()() const  
    template<class A>
    void operator()(A a) const  (void)(a); 
    template<class A, class B>
    void operator()(A a, B b) const  (void)(a); (void)(b); 
    template<class A, class B, class C>
    void operator()(A a, B b, C c) const  (void)(a); (void)(b); (void)(c); 
;

这里是任意数量参数的 C++11 变体:

struct VoidNoOp 
    void operator()() const  ;
    template<typename P1, typename... Params>
    void operator()(P1 p1, Params... parameters) 
        (void)(p1);             // we do this just to remove warnings -- requires the recursion
        operator()(parameters...);
    
;

【讨论】:

【参考方案3】:

这个怎么样?

// Return a noop function 
template <typename T>
struct noop

  T return_val;

  noop (T retval = T ())
       :  return_val (retval)
  
  

  T
  operator (...)
  
    return return_val;
  
;

template <>
struct noop<void>

  void
  operator (...)
  
  
;

这应该适用于任何用途。

【讨论】:

请注意,如果您尝试将非平凡可复制的类型作为参数传递给 noop,则会失败,因为它们不适用于 ...【参考方案4】:

您可能正在考虑身份函数(std::identity,显然它已在当前草案中被删除),但这不是一回事。

【讨论】:

我知道identity,但因为它是一元而忽略了它。我记得六个月前需要一个通用的 default_deleter 来做某事……不太记得是为了什么。

以上是关于C++(0x) 中是不是存在无操作“啥都不做”函数对象?的主要内容,如果未能解决你的问题,请参考以下文章

为啥#后跟一个数字似乎在C plus plus中啥都不做

C++ std::Thread 程序啥都不做[关闭]

如果存在,如何包含外部 html,否则啥都不做?

想让 HTML 表单提交啥都不做

为啥我的 Activity 在恢复时再次从顶部运行而不是啥都不做?

如何创建一个在 React 中啥都不做的函数