【发布时间】:2017-04-07 16:56:37
【问题描述】:
我有一系列字段验证器,每个都类似于以下内容:
template <typename T>
class NameValidator : public Validator<T> {
...
bool validate(const T& msg) const override { ... }
...
};
每个验证器都必须能够验证不同的消息类型,因此模板参数T。
我想创建一个管理器类,作为这些验证器的公共网关。类似于以下内容:
class ValidatorManger {
...
// Calls validate() functions for each field.
template <typename T>
bool validate(const T& msg) { ... }
...
};
因此,我需要将每个验证器类(例如:NameValidator<T>)存储在某种类型的数据结构中,然后在 ValidatorManager::validate() 中迭代它们。
有没有办法做到这一点,这样我就不必为每种消息类型明确专门化模板?我正在成像以下内容
validator_map.insert(std::make_pair("Name", NameValidator<T>));
validator_map.insert(std::make_pair("Age", AgeValidator<T>());
...
虽然这显然是胡言乱语。
问题:
- 以前有没有人使用过这种模式并有解决方案来实现这一点?
- 我是否应该重新考虑这个设计?
【问题讨论】:
-
可以有一个元组并对其进行迭代。
-
为什么特殊的验证器例如 NameValidator 是一个模板?它不应该派生自 Validator
还是它应该验证的任何类型? -
@chris -- 你能澄清一下你的意思吗?
-
@ZivS -- 否。模板参数
T是消息的类型,而不是正在验证的底层事物的类型(通常,它不仅仅是一个简单的原语)。 -
@Ryan 重读这个问题,我希望您希望每个可能的
T都有一个vector<Validator<T>>元组。元组存储每个向量,这是一个不同的类型。validate使用带有std::get<T>(tuple)的消息类型获取向量,并接收该消息类型的验证器向量,我希望它看起来像下面 max66 的答案。
标签: c++ templates generics design-patterns