2010-06-05 24 views
17

Bunun, uygulamak için 2 saniyeden daha az süren bir şey için gülünç bir soru olduğunu anlıyorum. Ama belli ki yeni standartla tanıştığını okumayı hatırlıyorum.No-op "hiçbir şey yapmama" işlev nesnesi C++ (0x)?

VC10'un başlıklarını grep'ed ve hiçbir şey ile geldi. Yardım edebilir misin? Beni rahatsız ediyor! :)

düzenleme: Düşündüm de , ben hatırladım yeni funktor muhtemelen ilgisiz std::default_deleter oldu.

+3

AirMiles noktalarının Ne ziyan: Burada

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

parametrelerin keyfi sayılar için bir C++ 11 varyasyonu. Bu bir CW sorunu olmasaydı yapabileceğiniz tasarrufları hayal edin! – wilhelmtell

cevap

23

Hep no-op lambda yazabilirsiniz: []{}

+0

Bunu beğendim, ama hakkında std :: şartlı ' s için işe yaramıyor. Ve boş bir 'std :: function', operatöre() atar. – dean

+1

'[] (...) {}' herhangi bir sayıda girdi argümanında çalışacaktır. – Mikhail

0

Muhtemelen kimlik işlevi hakkında düşünüyordum (std :: kimlik ve görünüşe göre cari taslağında kaldırılır) gerçi aynı şey değildir.

+0

“Kimlik” 'i tanıyordum ama onu bir ünlüyüm diye reddettim. Altı ay önce, bir şey için genel bir default_deleter'e ihtiyaç duyduğumu hatırlıyorum. – dean

1

Bu nasıl?

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

Bu, hemen hemen her türlü kullanım için çalışmalıdır.

+0

Not: Hiç önemsiz olarak kopyalanamaz bir türü noop'a argüman olarak iletmeye çalışırsanız başarısız olur. – rerx

0

Bunu herhangi bir değer döndürmeyen bir functor beklediğim durumlar için no-op bir drop-in olarak kullanıyorum.

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