是否有任何等效于虚拟模板功能的模式?

问题描述 投票:0回答:1

我正在使用监视工具,并且我专注于降低运行时开销和使用简单的API。为了快速切换,我选择使用状态模式,并简化模板参数包的用法。

而且,这是我第一次在将编译时间和运行时间分开的立场上进行斗争,当然不能使虚拟模板函数正常工作。

考虑以下限制,我正在寻找解决方法或等效的解决方案:

  • 最低的“已禁用”状态运行时成本
  • Flexible API
  • 符合C ++ 17之前的规范

如果不可能的话,也可以...

代码示例:

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状态。删除模板并进行大量的重载就可以做到,但是如果可以避免,它将成为一个很好的解决方案。

c++ templates monitoring template-meta-programming
1个回答
0
投票

您可以尝试使用其他方法(基于合成而不是继承)来维护模板,如下所示:

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;
© www.soinside.com 2019 - 2024. All rights reserved.