c++ - 是否有与虚拟模板功能等效的模式?

标签 c++ templates monitoring template-meta-programming

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

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

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

  • “禁用”状态
  • 的最低运行时间成本
  • 灵活的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状态。删除模板并进行大量的重载就可以做到,但是如果可以避免的话,这将成为一个很好的解决方案。

    最佳答案

    您可以尝试维护模板的另一种方法(基于合成而不是继承),如下所示:

    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;
    

    关于c++ - 是否有与虚拟模板功能等效的模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62001959/

    相关文章:

    c++ - 如何创建一个结构实例,当它超出范围时不会被删除?

    c++ - VTK:可视化深度缓冲区

    c++ - lambdas 的调用操作符是否需要链接?

    c++ - 避免具有继承的类之间重复 typedef

    java - jetty 间歇性崩溃的问题

    c++ - 在计算负数的二进制补码时如何实现添加 "+1"步骤

    c++ - C++ 编译器能否尝试不同的(模板 T)实现,直到找到一个可以编译(针对 T)的实现?

    iphone - startMonitoringForRegion 从不调用 didEnterRegion/didExitRegion

    performance - 监控所有 API 响应时间的服务质量,哪个更接近中值、跨度 5-95 或上 95?

    c++ - 为什么这不编译?不匹配 'operator&='