2010-06-05 61 views
17

我意识到这是一个可笑的问题,需要不到2秒的时间才能实现。但我隐约记得,阅读新标准的介绍。C++(0x)中是否存在no-op“do nothing”函数对象?

我grep'ed VC10的标题,并没有提出什么。你能帮我吗?它在扰乱我! :)

编辑: 关于第二个想法,在新的算符,我记得大概是无关std::default_deleter

+3

什么的AIRMILES点浪费。想象一下,如果这不是一个CW问题,你可以节省多少钱! – wilhelmtell 2010-06-06 00:17:45

回答

23

你总是可以写一个无操作拉姆达:[]{}

+0

我喜欢这个,但它对于我散布的'std :: conditional'数量不起作用。而一个空的'std :: function'将会在operator()上抛出。 – dean 2010-06-06 01:01:09

+1

'[](...){}'适用于任意数量的输入参数。 – Mikhail 2016-12-24 20:53:16

0

你可能是想确定身份的功能(标准::身份,显然它在目前的草案中删除)是不是一回事,虽然。

+0

我曾经认识过“身份”,但因为是一个单身而被解雇。我记得在六个月前需要一个通用的default_deleter来完成某件事......不能完全记住。 – dean 2010-06-06 20:52:09

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

这应该适用于任何用途。

+0

请注意,如果您曾尝试将非平凡可复制类型作为参数传递给noop,则会失败,因为它们不适用于... – rerx 2014-09-09 15:07:06

0

我使用这个作为插入式无操作的情况下,我期望函数不返回任何值。

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