C++11 - 元组向量

C++11 - vector of tuples

我创建了一个类型

using Parameter = std::tuple<unsigned int, std::string>;

而在我的class中,我有一个像这样的属性(注意:矢量,unique_ptr和字符串都包括在内 - 没有问题)

class MyClass
{

public:
    std::vector<std::unique_ptr<Parameter>> parameters;

public:
    explicit MyClass(const std::vector<std::string> &data);
};

有定义

MyClass::MyClass(const std::vector<std::string> &data){
    for (int i = 0; i < data.size(); i += 2) {
        this->parameters.insert(
            std::unique_ptr<Parameter>(
                static_cast<unsigned int>(std::stoi(data[i])), 
                std::string(data[i + 1])
            )
        );
    }
}

编译器的结果:

error: no matching function for call to ‘std::vector<std::tuple<unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::insert(semac::command::Parameter)’

所以我的问题是:有没有像我在代码中尝试的那样创建 using MyTuple = std::tuple<...>; 实例的方法?一般来说,执行此操作的最佳方法是什么?

(我创建答案只是为了回答这个问题)

正如 Igor Tandetnik 和一些程序员所说,正确的方法是使用 std::make_uniquestd::unique_ptr<Parameter>(new Parameter(static_cast‌​<unsigned int>(std::stoi(data[i])), data[i + 1]))

最终代码可能如下所示:

MyClass::MyClass(const std::vector<std::string> &data){
    for (int i = 0; i < data.size(); i += 2) {
        this->parameters.push_back(std::unique_ptr<Parameter>(new Parameter(static_cast‌​<unsigned int>(std::stoi(data[i])), data[i + 1])));
    }
}

正如 user6386155 提到的,可以使用 emplace_back 方法 (std::vector::emplace_back) 来完成。

MyClass::MyClass(const std::vector<std::string> &data){
    for (int i = 0; i < data.size(); i += 2) {
        this->parameters.emplace_back(new Parameter(static_cast‌​<unsigned int>(std::stoi(data[i])), data[i + 1]));
    }
}

另外小心使用CLionIDE(2017.2.1),有bug

我因此很困惑。