Определите только интерфейс 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
уже управляет своей памятью за вас, и это одна из основных причин его использования.