将对象类型传递给std :: array构造函数

时间:2015-05-06 13:42:04

标签: java c++

我正在尝试使用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。另外我知道从函数返回指针并不是一个好主意,但我想保持代码尽可能接近原始

1 个答案:

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