2016-04-08 14 views
2

İki sınıfım var. Birinci sınıf bir şey yap ve sonra ikinci sınıfın yöntemini çağır. Birinci sınıfın her yöntemi bunu yapar. Bazı makro kullanarak kod uygulamasının otomatikleştirilmesi mümkün mü?C++ işlev adını makroya iletmek ve çağırarak

Örnek:

class A 
{ 
    void Do1() 
    { 
    Do task x 
    ClassB b; 
    b.Do1(); 
    Do task y 
    } 
    void Do2() 
    { 
    Do task x 
    ClassB b; 
    b.Do2(); 
    Do task y 
    } 
} 

bu şekilde uygulamak mümkün mü? Bu işe yaramıyor, ama benzer bir şey.

#define VOID_FUNC(name) \ 
    Do task x;\ 
    ClassB b;\ 
    b.##name##();\ 
    Do task y; 

class A 
{ 
    void Do1() 
    { 
    VOID_FUNC(__FUNCTION__); 
    } 
    void Do2() 
    { 
    VOID_FUNC(__FUNCTION__); 
    } 
} 
+0

ama şablonlarını kullanmak için şirin bir yol olacağını, 'std :: bind', ve 'std :: function'. Bunu çizen bir cevap vermeyi yeğlerim. – Bathsheba

+0

Sorduğun şeyi yaratmanın kolay bir yolu yok gibi görünüyor ve çok kolay olmayan yollar gerçekten hızlı bir şekilde çirkinleşiyor; Bunu neden yapmak istediğinizi açıklarsanız size yardımcı olabilir, çünkü amacınızı gerçekleştirmenin daha iyi bir yolu olabilir mi? Sınıfın kullandığı bazı kaynak türlerini yöneten, görev x'in kaynağı alacağı ve görevi bırakacağı mevcut bir sınıfın etrafına bir sarıcı yazmak isteyebilirsiniz. Bana gelen bir fikir, C++ Standart Kitaplığı'nın genellikle günlüğe kaydetme gibi şeylerde bile uyarlanabilen özel ayırma araçlarına izin vermesidir. –

cevap

2

Makrolardan kaçınmak için birçok iyi neden vardır, çünkü bunlara ad alanlarına uymuyorlar.

başka çözüm task x ve task y yeniden istediğinizde lambda fonksiyonları (daha sonra C++ 11 ve) kullanmaktır: yerine lambda bölgesinin functors oluşturabilir önceden C++ 11 için

class A 
{ 
    template <typename Fun> 
    void wrapClassB(Fun&& fun) 
    { 
    Do task x 
    ClassB b; 
    fun(b); 
    Do task y 
    } 

    void Do1() 
    { 
    wrapClassB([] (ClassB& b) { 
    b.Do1(); 
    }); 
    } 
    void Do2() 
    { 
    wrapClassB([] (ClassB& b) { 
    b.Do2(); 
    }); 
    } 
}; 

ve Fun&&'u const Fun& ile değiştirin. Gerçekten makroları kullanmak istiyorsanız

Alternatif olarak, sadece makro ile bütün fonksiyonunu tanımlayabiliriz: Muhtemelen

#define VOID_FUNC(name) \ 
    void name() {\ 
    Do task x;\ 
    ClassB b;\ 
    b.name();\ 
    Do task y;\ 
    } 
class A 
{ 
    VOID_FUNC(Do1) 
    VOID_FUNC(Do2) 
}; 
+2

C++ 11 lambda'yı ekledi, ancak bu sadece funktörler inşa etmenin çok uygun bir yoludur. Bunları 1998'de geri alabilirsiniz. – MSalters

+0

Elbette @MSalters, iyi nokta! Cevabı biraz güncelledim – Hilborn

İlgili konular