gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:53:00 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com