模板元编程以禁用类的功能

时间:2015-02-13 16:36:53

标签: c++ metaprogramming

我有一堆松散耦合的类(没有通用接口),在我的应用程序中,我使用这些类进行处理。 我希望能够提出一种通用方法来禁用其中一些类,这样它们就不会被编译或消耗运行时资源。

class A {
void doA(int a, char b);
};
class B {
void processB();
};
...
int main() {
A a;
B b;
a.doA(1, 'c');
b.processB();
}

我可以使用布尔参数定义一个模板,并在它真实时将其专门化,在doA或processB中不执行任何操作。但后来我必须为每个类定义模板。 有任何聪明的想法来设计一个可以绕过任意类的任意函数调用的通用模板吗? e.g。

typedef Magic<A, false> AT; // class A is dummied out
typedef Magic<B, true> BT; // class B would still have functionality
int main() {
AT a;
BT b;
a.doA(1, 'c'); // this does nothing and will be optimized away by compiler
b.processB(); // this is real
}

1 个答案:

答案 0 :(得分:0)

由于您需要保持类的接口完整,我无法想象一个完全通用的解决方案。我可以提供这个黑客。我们的想法是通过将函数体包装在宏中来修改类,这可以有条件地定义代码:

#if /* Condition which controls whether class A should be used */
  #define CLASS_A_BODY(...) __VA_ARGS__
#else
  #define CLASS_A_BODY(...)
#endif

class A
{
  void doA(int a, char b)
  { CLASS_A_BODY(   
    do_stuff_with(a);
    and_with(b);
    as_before(a, b);
  ) }
};

当然,您必须对返回值的函数执行某些操作(但对于任何解决方案都是如此)。