Существует ли функциональный объект "не делать ничего" в C ++ (0x)? - PullRequest
21 голосов
/ 06 июня 2010

Я понимаю, что это нелепый вопрос, для реализации которого требуется менее 2 секунд. Но я смутно помню, что читал, что один был введен с новым стандартом.

Я записал заголовки VC10 и ничего не нашел. Вы можете помочь? Это беспокоит меня! :)

редактирование: Если подумать, я вспомнил, что новым функтором был не связанный std::default_deleter.

Ответы [ 4 ]

26 голосов
/ 06 июня 2010

Вы всегда можете написать лямбду без опциона: []{}

0 голосов
/ 09 сентября 2014

Я использую это как бездействие для случаев, когда я ожидаю, что функтор не возвращает никакого значения.

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 голосов
/ 08 сентября 2010

Как насчет этого?

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

Это должно работать практически для любого использования.

0 голосов
/ 06 июня 2010

Возможно, вы думали о функции идентификации (std :: identity и, очевидно, она удалена в текущем черновике), хотя это не одно и то же.

...