我正在尝试使用java
重写c++
代码。我根本不熟悉c ++。
原始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
方法作为接口的类。
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]);
但我的主要问题是如何使用std :: type_info将类类型传递给std :: array的构造函数?或者使用这个对象是不可能的?
P.S。另外我知道从函数返回指针并不是一个好主意,但我想保持代码尽可能接近原始
答案 0 :(得分:3)
这一行有三个问题:
std::array<command->getClassOfK(), templates.size()> arr;
array
类模板需要用两个东西进行实例化:一个类型和一个可转换为size_t
的常量表达式。这两件事都需要在编译时 。 templates.size()
基于运行时中list
的元素数量,因此无法将list<T>
转换为std::array<K, N>
。第二个问题是getClassOfK()
不是一个类型 - 它是一个返回一个对象的函数 - 它根本不是array
所需要的。这是一个更简单的问题,你需要传递K
的类型,你已经拥有它:它只是K
。最后一个问题是,您希望返回K*
而array<K,N>
不 a K*
。
编写此代码的正确方法是使用动态容器。具体而言,std::vector
:
template<class K, class T>
static std::vector<K*> toArray(ITemplateCommand<T,K> *command, std::list<T>& templates) {
std::vector<K*> vec;
vec.reserve(templates.size());
for (T& tmpl : templates) {
vec.push_back(command->buildTemplate(tmpl));
}
return vec;
}