c++ - 禁用类功能的模板元编程

标签 c++ metaprogramming

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

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

我可以定义一个带有 bool 参数的模板,并在它为真时专门化它,在 doA 或 processB 中什么也不做。但是我必须为这些类中的每一个定义模板。 设计一个可以绕过任意类的任意函数调用的通用模板有什么聪明的想法吗?例如

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
}

最佳答案

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

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

当然,您必须对返回值的函数做一些事情(但对于任何解决方案都是如此)。

关于c++ - 禁用类功能的模板元编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28504352/

相关文章:

lisp - common-lisp 中更好的 pythonic `join`

c++ - 回调 g_source_set 回调总是被调用?

java - 您可以使用 Groovy 元编程来覆盖 Java 类上的私有(private)方法吗

elixir - 我怎么能在 elixir 中看到所有模块的导入和定义函数?

c++ - 给定两个点 (x1,y1) (x2,y2),我如何计算 N 个不同的点均匀地位于给定点之间的线上

c++ - 如何构建仅算术模板对象?

ruby - 从类方法中获取类名

c++ - 通过函数传递未命名的类

c++ - 如何在 C++ 中使用 X11 知道按键?

c++ - 期望在两个相同平台上构建两个共享库是否合理?