如何用构建器实现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
相关产品推荐
相关产品推荐

