C++(0x)中是否存在一个“什么也不做”的no-op函数对象?

28

我知道这个问题听起来很荒谬,因为这只需要不到2秒钟的时间即可实现。但是我模糊地记得新标准引入了一种。

我在VC10的头文件中使用grep却没有找到。你能帮忙吗?这让我困扰不已!:)

编辑: 仔细想想,我记得那个新的函数对象可能是无关的std::default_deleter


3
AirMiles点数白白浪费了,如果这不是一个CW问题,想象一下你可以节省多少钱!(注:CW指Coursework,课程作业的意思) - wilhelmtell
4个回答

34

您可以编写一个无操作的lambda表达式:[]{}


1
我喜欢这个,但它不能处理我散布的std::conditional数量。而一个空的std::function在operator()上会抛出异常。 - dean
是的,但每个 []{} 都将成为一个不同的类型。我可以看到将无操作函数命名为单一名称的几个优点。 - Billy Donahue

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...);
    }
};

0
你可能在想标识函数(std::identity),但显然它已经在当前的草案中被移除了,这不是同一件事情。

我曾经知道过 identity,但因为它是一元的而将其忽略了。我记得六个月前需要一个通用的 default_deleter,但不太记得是为了什么了。 - dean

-1

这个怎么样?

// 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 (...)
  {
  }
};

这应该适用于任何用途。


2
请注意,如果您尝试将非平凡可复制类型作为参数传递给noop,则会失败,因为它们与...不兼容。 - rerx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接