【发布时间】:2025-11-29 03:55:01
【问题描述】:
我有一个性能关键的应用程序,需要通过各种特征类来修改我的类的行为。一些更复杂的变体需要主类中的其他类成员。
所以我的问题是:根据所使用的特征类,提供此类成员的最有效方法是什么?
我想要的是这样的:
template <class Traits> MainClass {
typedef typename Traits::MemberType MT;
public:
MT my_member;
void do_something() {
std::cout << Traits::get_number(this) << std::endl;
}
...
};
class Zero {
public:
typedef void MemberType;
static inline int get_number(MainClass<Zero>*) { return 0; }
}
class IntegerNumber {
public:
typedef int MemberType;
static inline int get_number(MainClass<IntegerNumber>* myclass) { return myclass->my_member; }
}
现在这不起作用,因为您不能声明变量 void。但由于我将拥有大量 MainClass 实例并且有许多不同的特征类,我不希望每个可能的特征都有“虚拟”变量。
实现这一点的一种可能性是通过继承,但这正是我想通过使用模板首先避免的,因为这会导致性能损失,尤其是在具有多个不同特征时。
所以我的问题是:
- 我可以告诉编译器消除类中某些未使用的成员变量吗?
- 您将如何解决这个问题?是否有其他可能实现这一点?
- 哪种方法最有效?
【问题讨论】:
-
AFAIK 你只能通过专门的模板或使用预处理器来做到这一点。
-
没有多态性的继承是否会导致性能问题(我认为它已被编译器优化并且不会导致运行时开销,但我不确定)?
-
@NathanOliver 我想尽可能避免使用预处理器(无论如何它不能直接绑定到模板,对吧?)。在谈到模板专业化时,您是指 Sopel 提出的解决方案还是您有其他想法?
-
@nefas 我是这么认为的,但我不再那么确定了。可能有一个小的基类,这确实会被优化。
标签: c++ performance templates