сохранение экземпляра класса с шаблоном на std :: vector - PullRequest
1 голос
/ 08 июля 2020

У меня есть этот класс, который я создал для форматирования некоторых строк на основе некоторых условий ...

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, с которым я тоже могу взаимодействовать с вектором (я пытался создать класс объекта, который унаследовал класс FlatFileStructure, но я не могу выполнить приведение из "Объект" в "FlatFileStructure" '

1 Ответ

3 голосов
/ 08 июля 2020

Определите только интерфейс publi c (и переименуйте параметры шаблона, рекомендуется использовать другое соглашение об именах, чем для "обычных" типов):

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);
};

Ничто в интерфейсе не зависит от параметр шаблона. Вы можете переместить интерфейс в не шаблонный базовый класс:

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;
};

И использовать вектор общих указателей на этот базовый класс:

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
     }
};

... но я не могу выполнить приведение из "Object" в 'FlatFileStructure '

Если вам нужно отливать, значит, с вашим дизайном что-то не так. Предполагая, что вы не упустили детали, интерфейс publi c для FlatFileStructure<A,C,D> точно такой же для любого A,B,C, и никогда не должно быть необходимости в преобразовании.

PS: Конечно, вы не делаете этого. хочу new std::vector. A std::vector уже управляет своей памятью за вас, и это одна из основных причин его использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...