用于禁用 class 功能的模板元编程
template metaprogramming to disable functionality of a class
我有一堆松散耦合的 classes(没有公共接口),在我的应用程序中,我使用这些 classes 进行处理。
我希望能够想出一种通用方法来禁用其中一些 classes,这样它们就不会被编译或消耗运行时资源。
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 中什么也不做。但是我必须为这些 class 中的每一个定义模板。
设计一个可以绕过任意 class 上的任意函数调用的通用模板有什么聪明的想法吗?例如
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
}
由于您需要 类 的接口保持完整,我无法想象一个完全通用的解决方案。我可以提供这个技巧。这个想法是通过将函数的主体包装在一个可以有条件地定义代码的宏中来修改 类:
#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);
) }
};
当然,您必须对 return 一个值的函数做一些事情(但对于任何解决方案都是如此)。
我有一堆松散耦合的 classes(没有公共接口),在我的应用程序中,我使用这些 classes 进行处理。 我希望能够想出一种通用方法来禁用其中一些 classes,这样它们就不会被编译或消耗运行时资源。
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 中什么也不做。但是我必须为这些 class 中的每一个定义模板。 设计一个可以绕过任意 class 上的任意函数调用的通用模板有什么聪明的想法吗?例如
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
}
由于您需要 类 的接口保持完整,我无法想象一个完全通用的解决方案。我可以提供这个技巧。这个想法是通过将函数的主体包装在一个可以有条件地定义代码的宏中来修改 类:
#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);
) }
};
当然,您必须对 return 一个值的函数做一些事情(但对于任何解决方案都是如此)。