c++ - 在 std::vector 上存储带有模板的类实例

标签 c++ templates

我有这个类,我创建它是为了在某些条件下格式化一些字符串......

template <class PropObject, class PropType, PropType PropObject::* Prop>
class FlatFileStructure
{
private:
    size_t _startPosition;
    size_t _size;
    int _fieldStyle;

public:
    FlatFileStructure(size_t posicaoInicial, size_t tamanho, TipoDoCampo tipoDoCampo)
        : _startPosition(posicaoInicial),
        _size(tamanho),
        _fieldStyle(tipoDoCampo)
    {}


    size_t getPosicaoInicial() { return _startPosition; }
    size_t getTamanho() { return _size; }

    std::string getConteudoFormatado(const std::string& tmpConteudo)
    {
        PropObject& po = static_cast<PropObject&>(o);
        PropType& t = po.*Prop;

        std::string conteudo = t;

        if (_tipoDoCampo == TipoDoCampo::ALFANUMERICO)
        {
            if (conteudo.size() > _tamanho)
                conteudo = util::truncate(conteudo, _tamanho);

            conteudo = util::pad_right(conteudo, _tamanho, ' ');
        }

        else if (_tipoDoCampo == TipoDoCampo::NUMERICO || _tipoDoCampo == TipoDoCampo::NUMERICO_SEQUENCIAL)
        {
            if (conteudo.size() > _tamanho)
                conteudo = util::truncate_numeric(conteudo, _tamanho);

            conteudo = util::pad_left(conteudo, _tamanho, '0');
        }

        else if (_tipoDoCampo == TipoDoCampo::DATA)
        {
            if (conteudo.empty())
                conteudo = dragonfly::DateTimeHelper::hoje("%d%m%y");
            else
                conteudo = dragonfly::DateTimeHelper::formataData_de_para(conteudo, "%d.%m.%Y", "%d%m%y");
        }

        return conteudo;
    }
};
要使用此类,我有以下代码:
_descricaoDosCampos = new std::vector<????????>();
_descricaoDosCampos->push_back(new FlatFileStructure<Tipo0, std::string, &Tipo0::tipoRegistro>(0, 1, TipoDoCampo::NUMERICO, "0"));
_descricaoDosCampos->push_back(new FlatFileStructure<Tipo0, std::string, &Tipo0::sequencialRegistro>(394, 6, TipoDoCampo::NUMERICO_SEQUENCIAL, "000001"));
我怎么能将类实例存储在std::vector上,我也可以通过 vector 进行交互(我试图创建一个'object'类,FlatFileStructure类继承,但是,我无法从中转换“对象”到 'FlatFileStructure'

最佳答案

仅考虑公共(public)接口(interface)(并重命名模板参数,建议使用与“普通”类型不同的命名约定):

template <class T, class U, U T::* Prop>
class FlatFileStructure
{
public:
    FlatFileStructure(size_t posicaoInicial, size_t tamanho, TipoDoCampo tipoDoCampo);
    size_t getPosicaoInicial();
    size_t getTamanho();
    std::string getConteudoFormatado(const std::string& tmpConteudo);
};
接口(interface)的任何内容都不依赖于模板参数。您可以将接口(interface)移动到非模板基类:
struct base {
public:
    base(size_t posicaoInicial, size_t tamanho, TipoDoCampo tipoDoCampo);       
    virtual size_t getPosicaoInicial();
    virtual size_t getTamanho();
    virtual std::string getConteudoFormatado(const std::string& tmpConteudo);
    virtual ~base() = default;
};
并使用指向该基类的共享指针 vector :
std::vector<std::shared_ptr<base>>
具体的类可以模板化:
template <class T, class U, U T::* Prop>
class FlatFileStructure : public base {

    std::string getConteudoFormatado(const std::string& tmpConteudo) override {
        // do any T/U specific stuff here
     }
};

... but, I'm not able to cast from "Object" to 'FlatFileStructure<X,Y,T>'


如果你必须强制转换,那么你的设计就有问题。假设您没有遗漏细节,FlatFileStructure<A,C,D> 的公共(public)界面对于任何 A,B,C 都完全相同并且永远不需要转换。
PS:你肯定不想要new std::vector .一个 std::vector已经为您管理它的内存,这就是使用它的主要原因之一。

关于c++ - 在 std::vector 上存储带有模板的类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62802310/

相关文章:

templates - 带有模板参数的 C++0x lambdas?

templates - Aurelia:嵌套模板替换

c++ - 如何修改一个类,使其只有一个成员函数,所有参数都默认?

javascript - 将 Handlebars 用于 HTML 以外的模板?

c++ - 如何在cout语句中显示相对文件路径

c++ - 使用 try_lock boost 锁定

c++ - 是否有可能获得未知类的类成员的数量和类型?

c++ - SFINAE 构造问题

c++ - 在 std 命名空间中添加模板特化

c++ - 与宽松的原子同步