You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用构建器实现C++策略式日志格式化器的动态创建与存储

问题:基于策略模式的C++日志格式化器构建与存储问题

我正在设计一款C++日志库,在格式化器类的实现上遇到了瓶颈。我的目标是能够根据配置字符串(如"[A] [B]"或"[B]")选择对应的策略,创建消息格式化器。以下是我基于策略设计实现的简化代码:

#include <iostream>
#include <string>
#include <memory>

template <typename PolicyA, typename PolicyB>
class Formatter : private PolicyA, private PolicyB {
    public:
    void Format(std::string& param_message) const {
        PolicyA::A(param_message);
        PolicyB::B(param_message);
    }
};

class Default {
protected:
    virtual void A(std::string& param_message) const = 0;
};

class ADefault : public virtual Default {
protected:
    void A(std::string& param_message) const {}
};

class AExplicit : public virtual Default {
protected:
    void A(std::string& param_message) const { param_message = "[A] " + param_message; }
};

class BDefault : public virtual Default {
protected:
    void B(std::string& param_message) const {}
};

class BExplicit : public virtual Default {
protected:
    void B(std::string& param_message) const { param_message = "[B] " + param_message; }
};

int main() {
    std::string message_1 = "message_1";
    std::string message_2 = "message_2";

    Formatter<ADefault, BDefault> default_message;
    Formatter<AExplicit, BExplicit> explicit_message;
    
    default_message.Format(message_1);
    explicit_message.Format(message_2);
    std::cout << message_1 << std::endl;
    std::cout << message_2 << std::endl;
}

该策略实现符合预期,但我不清楚如何实现一个可根据参数返回对应Formatter的构建器(Builder)函数。我已实现了解析配置字符串并返回Format枚举的函数:

enum class Format : uint16_t {
    NONE = 0x000, 
    A    = 0x001,
    B    = 0x002,
};


Format ConfigFormatter(std::string& param_configuration) {
    Format formatter_configuration = Format::NONE;

    if (param_configuration.find("[A]") != std::string::npos) {
        formatter_configuration += Format::A;
    }

    if (param_configuration.find("[B]") != std::string::npos) {
        formatter_configuration += Format::B;
    }

    return formatter_configuration;
}

现咨询以下问题:

  • 能否将创建好的Formatter作为其他类的成员变量存储?
  • 构建器类是否需要设计为带特化的变参类?我曾查找过变参工厂相关资料,但未找到可用方案。

内容的提问来源于stack exchange,提问作者Miguel Ravagnani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 15:35:13