我正在使用监视工具,并且我专注于降低运行时开销和使用简单的API。为了快速切换,我选择使用状态模式,并简化模板参数包的用法。
而且,这是我第一次在将编译时间和运行时间分开的立场上进行斗争,当然不能使虚拟模板函数正常工作。
考虑以下限制,我正在寻找解决方法或等效的解决方案:
如果不可能的话,也可以...
代码示例:
static struct /*Disabled*/ State
{
template <typename... Args>
/*virtual*/ void operator()(const char * category, Args&&... args) { /*noop*/ }
}
disabled;
static struct Enabled : State
{
template <typename... Args>
/*virtual*/ void operator()(const char * category, Args&&... args) { /*processing category and args*/ }
}
enabled;
struct Monitor
{
static State* state;
template <typename... Args>
static void write(const char * category, Args&&... args)
{
state->operator()(category, std::forward<Args>(args)...);
}
};
State* Monitor::state = &enabled;
int main()
{
Monitor::write("BulletCount", 42);
Monitor::write("Spell", "EnergyShield", true);
}
上面的代码可以编译,但是如果没有虚拟继承,我将永远无法达到Enabled
状态。删除模板并进行大量的重载就可以做到,但是如果可以避免,它将成为一个很好的解决方案。
您可以尝试使用其他方法(基于合成而不是继承)来维护模板,如下所示:
enum state_enum
{
ENABLED_ST,
DISABLE_ST
};
struct State
{
state_enum myState;
State(state_enum theState):myState(theState)
{}
template <typename... Args>
/*virtual*/ void operator()(const char * category, Args&&... args)
{
if(myState == DISABLE_ST)
{
// noop
}
else if(myState == ENABLED_ST)
{
}
}
};
static State enabled = State(ENABLED_ST);
static State disabled = State(DISABLE_ST);
struct Monitor
{
static State* state;
template <typename... Args>
static void write(const char * category, Args&&... args)
{
state->operator()(category, std::forward<Args>(args)...);
}
};
State* Monitor::state = &enabled;