Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在容器中存储模板化的派生类_C++_Templates_Generics_Design Patterns - Fatal编程技术网

C++ 在容器中存储模板化的派生类

C++ 在容器中存储模板化的派生类,c++,templates,generics,design-patterns,C++,Templates,Generics,Design Patterns,我有一系列字段验证器,每个字段验证器的外观如下所示: template <typename T> class NameValidator : public Validator<T> { ... bool validate(const T& msg) const override { ... } ... }; class ValidatorManger { ... // Calls validate() functio

我有一系列字段验证器,每个字段验证器的外观如下所示:

template <typename T>
class NameValidator : public Validator<T> {

    ...
    bool validate(const T& msg) const override { ... }
    ...

};
class ValidatorManger {

    ...
    // Calls validate() functions for each field.
    template <typename T>
    bool validate(const T& msg) { ... }
    ...

};
因此,我需要将每个验证器类(例如:
namevalidater
)存储在某种类型的数据结构中,然后在
ValidatorManager::validate()
中对它们进行迭代

有没有办法做到这一点,这样我就不必显式地专门化每种消息类型的模板?我在想象下面的情景

validator_map.insert(std::make_pair("Name", NameValidator<T>));
validator_map.insert(std::make_pair("Age", AgeValidator<T>());
...
validator_map.insert(std::make_pair(“Name”,namevidator));
插入(std::make_pair(“Age”,AgeValidator());
...
虽然这显然是胡言乱语

问题:

  • 以前有没有人使用过这种模式,并且有实现这种模式的解决方案
  • 我应该彻底重新考虑这个设计吗

如果你想要一个容器,你可以按照如下说明进食

validator_map.insert(std::pair("Name", NameValidator<T>()));
validator_map.insert(std::pair("Age", AgeValidator<T>()));

如果你想要一个容器,你可以像这样的指示食物

validator_map.insert(std::pair("Name", NameValidator<T>()));
validator_map.insert(std::pair("Age", AgeValidator<T>()));

有可能有一个元组并对其进行迭代。为什么特殊的验证器(例如NameValidator)是模板?它不应该派生自验证器或它应该验证的任何类型吗?@chris--你能澄清一下你的意思吗?@ZivS--不。模板参数
t
是消息的类型,而不是底层内容的类型正在验证(一般来说,这不仅仅是一个简单的原语)。@Ryan重读这个问题,我想你需要为每个可能的
T
使用
vector
的元组。元组存储每个不同类型的向量。
validate
使用
std::get(tuple)的消息类型获取向量
并接收该消息类型的验证器向量,我希望它看起来像下面max66的答案。有可能有一个元组并对其进行迭代。为什么特殊的验证器(例如NameValidator)是一个模板?它不应该派生自验证器或它应该验证的任何类型吗?@chris——你能澄清一下“t”是什么意思吗hat?@ZivS--No。模板参数
T
是消息的类型,而不是被验证的底层对象的类型(通常,它不仅仅是一个简单的原语)@Ryan重读这个问题,我想对于每个可能的
T
,您都需要一个
vector
的元组。元组存储每个不同类型的向量。
validate
使用消息类型和
std::get(元组)获取向量
并接收该消息类型的验证器向量,我希望它与下面的max66的答案类似。