Я пытаюсь переписать java
код с помощью c++
. Я вообще не владею C++.передать тип объекта в std :: конструктор массива
Оригинал java
код
public static <T, K> K[] toArray(ITemplateCommand<T, K> command, List<T> templates) {
if (null == templates) {
return null;
}
K[] array = (K[]) Array.newInstance(command.getClassOfK(), templates.size());
for (int i = 0; i < templates.size(); i++) {
array[i] = command.buildTemplate(templates.get(i));
}
return array;
}
Мой c++
код.
class TemplateImplementation {
public:
template<class K, class T>
static K* toArray(ITemplateCommand<T,K> *command, std::list<T>& templates) {
if (nullptr == templates) {
return nullptr;
}
std::array<command->getClassOfK(), templates.size()> arr; // no idea how to pass object type there
for(int i = 0; i < templates.size(); i++) {
arr[i] = command->buildTemplate(templates[i]);
}
}
};
В java
Я создал интерфейс и несколько осуществления, где getClassOfK
возвращаемый класс из K
объекта.
Здесь, чтобы упростить вещи, я решил не создавать творческие реализации, а только класс с методами virtual
, которые служат как inteface.
template<class T, class K>
class ITemplateCommand {
public:
virtual K* buildTemplate(T* tmplate);
virtual std::type_info getClassOfK();
};
Но у меня есть несколько ошибок во время компиляции (я использую онлайн c++
компилятора)
sh-4.2# g++ -std=c++11 -o main *.cpp
main.cpp: In static member function 'static K* TemplateImplementation::toArray(ITemplateCommand<T, K>*, std::list<T>&)':
main.cpp:24:64: error: type/value mismatch at argument 1 in template parameter list for 'template<class _Tp, long unsigned int _Nm> struct std::array'
std::array<command->getClassOfK(), templates.size()> arr; // no idea how to pass object type there
^
main.cpp:24:64: error: expected a type, got 'command->.getClassOfK()'
main.cpp:24:69: error: invalid type in declaration before ';' token
std::array<command->getClassOfK(), templates.size()> arr; // no idea how to pass object type there
^
main.cpp:26:22: error: invalid types 'int[int]' for array subscript
arr[i] = command->buildTemplate(templates[i]);
Но мой главный вопрос заключается в как передать тип класса в конструктор станда :: массив с помощью зОму: : type_info? Или это невозможно с помощью этого объекта?
P.S. Кроме того, я знаю, что это не очень хорошая идея, чтобы возвращать указатели из функции, но я хочу, чтобы держать код как можно ближе к оригинальному
Здесь происходит фундаментальное несоответствие. Шаблоны C++ основаны на специализации времени компиляции, поэтому вы не можете создать шаблон из значения времени выполнения. – user1937198
Хм ... Так что нельзя переписать исходный код? – lapots
Это, вам просто нужно понять C++. Начните с просмотра std :: vector и использования параметров шаблона C++. – user1937198