【发布时间】:2020-11-20 06:30:25
【问题描述】:
您好,我是 C++ 新手,我正在尝试创建一个类层次结构,其中每个类代表模式文档中的一个节点,想想 json-schema。看看例如的表示string。 string 可以有三个可选的约束
min_lengthmax_lengthpattern
此外,string 是 type,因此有一个基类表示 type,所有类型(boolean、number、...)都从该基类继承。现在,实现这一目标的一种方法是编写类似
struct Type {
const std::string m_name;
Type(const std::string& name)
: m_name{name}
{}
virtual X Serialize() const {
//...
}
};
struct String : Type {
const int m_max_len;
const int m_min_len;
const std::string m_pattern;
String(int min_len, int max_len, const std::string& pattern)
: Type("string")
, m_min_len(min_len)
, m_max_len(max_len)
, m_pattern(pattern)
{}
X Serialize() const override {
// If min_length was not set then it should be omitted from the serialized output.
}
};
此 String 实现不会使约束成为可选。怎么办?
选项:
- 可以采用一种策略,将默认构造函数参数设置为一些“非法”值,例如
INT_MIN(在这种情况下可以使用,因为长度不能为负数),但在一般情况下不起作用。很可能所有可能的整数都是合法值,pattern参数也是如此。 - 您不希望为可选参数的每个可能排列使用不同的构造函数。在这种情况下,有三个可选值会产生
2^3不同的构造函数。此外,编译器也无法区分构造函数String(int min_length)和String(int max_length)。 - 可以做类似的事情
String(int* min_length = nullptr, int* max_length = nullptr, const std::string* nullptr)
但是您必须使用new/delete或为设置的参数提供左值。 - 最后每个成员都可以是
std::unique_ptr。String(std::unique_ptr<int> min_value nullptr, std::unique_ptr<int> max_value = nullptr, std::unique_ptr<const std::string> pattern = nullptr)
但是在创建String的实例时,您最终会遇到相当复杂的调用。此外,如果实现一个Types 的容器,它可能有自己的可选参数,很快就会失控。
最后,代码必须兼容 C++14。
【问题讨论】:
-
我不确定你的问题到底是什么。
-
我觉得这里不用多态会容易很多
-
“因为长度不能为负” -- 当一个值不能为负时,你应该使用
unsigned整数,而不是普通的int。跨度> -
为什么
Type与您的问题相关?当我跳过您的问题中涉及您的类型层次结构的部分时,这与我阅读整个内容时一样有意义。似乎这个问题应该集中在您的带有可选参数的类上,而不是多态性。我在多态性讨论中看到的一个相关细节是提到您需要区分“未给出参数”和“给定参数不施加任何限制”(后者的一个示例是将最小长度设置为 0)。您可能想在文中提及该细节。
标签: c++ class c++14 optional-parameters