C ++ - 为std :: vector <double>创建新的构造函数?

时间:2016-01-06 09:15:08

标签: c++

我编写了一个包含std::vector<double>实例的自定义容器类 - 效果很好。为了与其他API兼容,我想将容器的内容导出为std::vector<double>副本。目前这有效:

MyContainer container;
....
std::vector<double> vc(container.begin(), container.end());

但如果可能的话希望能够写下来:

MyContainer container;
....
std::vector<double> vc(container);

我可以(轻松)创建这样的std::vector<double>构造函数吗?

3 个答案:

答案 0 :(得分:17)

您可以创建一个到std::vector<double>的显式转换:

explicit operator std::vector<double>() const {
    return std::vector<double>(begin(), end());
}

然后,std::vector<double> vc(container);将调用std::vector<double>移动构造函数。

请注意,计算成本高昂的转换通常不受欢迎。因此,矢量工厂函数可能是一种更明智的方法:

class MyContainer {
public:
    using value_type = double;
    // ...
};

template<typename Source>
auto to_vector(Source source) {
    return std::vector<typename Source::value_type>(source.begin(), source.end());
}

然后你写了:

MyContainer container;
// ...
auto vc = to_vector(container);

这也更通用,因为它适用于具有兼容的value_typebeginend成员的任何内容。

答案 1 :(得分:2)

  

我可以(轻松)创建这样的std :: vector构造函数吗?

不,你不能,因为这需要更改std::vector类声明。

您可以为MyContainer提供std::vector<double>的强制转换操作符。

答案 2 :(得分:1)

您不能也不应该更改您自己没有编写的类的API。但我认为在你的情况下,演员可以做得很好。例如(这个需要-std=c++11):

#include <iostream>
#include <vector>

struct Foo
{
  operator std::vector<double> () const
  {
    return std::vector<double> { 1, 2, 3 };
  }
};

int main()
{
  Foo foo;
  std::vector<double> bar = foo; // Applies the cast operator defined in Foo
  std::cout << bar.size() << std::endl; // Prints "3"
  return 0;
}