我编写了一个包含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>
构造函数吗?
答案 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_type
,begin
和end
成员的任何内容。
答案 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;
}