2016-04-08 78 views
2

我有两个类。第一类做一些事情,然后调用第二类方法。第一类的每种方法都是这样做的。是否有可能使用某些宏自动化代码实现?C++将函数名称传递给宏并调用它

例子:

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

是否有可能实现这种方式?这不起作用,但类似的东西。

#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

可能,但可爱的方法是使用模板,'的std :: bind',和'std :: function'。我肯定会赞扬一个答案,勾勒出这一点。 – Bathsheba

+0

似乎没有一种简单的方法来创建你所要求的内容,而不那么简单的方法真正快速变得丑陋;如果你解释为什么要这样做,这可能会有所帮助,因为可能有更好的方法来实现你的目的?看起来好像你想围绕一个现有的类来编写一个包装,该类处理类使用的某种资源,其中任务x将获取资源,任务y将释放它。我想到的一个想法是,C++标准库通常允许实际上可以适应的自定义分配器,即使对于日志记录等事情也是如此。 –

回答

2

有很多很好的理由避免宏,因为他们不尊重命名空间。

另一种解决方案是,当要重新使用task xtask y使用lambda函数(C++ 11以后):

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

对于预C++ 11可以创建functors代替lambdas和用const Fun&代替Fun&&

或者,如果你真的想用宏,你可以只与宏定义功能全:

#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的,但这只是一个非常方便的构造函子的方法。你可以在1998年手卷他们。 – MSalters

+0

当然你可以@MSalters,好点!我已经稍微更新了答案 – Hilborn

相关问题