我有一个关于使用typedef
封装特定类型的快速问题。假设我有一个类Foo
,其构造函数具有特定值,但我想使用typedef
隐藏特定类型:
class Foo {
public:
typedef boost::shared_ptr< std::vector<int> > value_type;
Foo(value_type val) : val_(val) {}
private:
value_type val_;
};
但在这种情况下,主要功能仍然必须知道类型(所以它明确使用std::vector<int>
):
int main() {
Foo::value_type val(new std::vector<int>());
val->push_back(123);
Foo foo(val);
return 0;
}
如何在Foo
构造函数中避免向量的深层副本的同时解决这个问题?
答案 0 :(得分:6)
各种解决方案:
Foo::value_type val(new Foo::value_type::element_type());
// least change from your current code, might be too verbose or too
// coupled to boost's smart pointer library, depending on your needs
Foo::value_type val(new Foo::element_type());
// add this typedef to Foo: typedef value_type::element_type element_type;
Foo::value_type val = Foo::new_value_type();
// static method in Foo, allows you to even easily change from new (as you
// encapsulate the whole smart pointer, and can specify another deleter to the
// boost::shared_ptr)
struct Foo {
static value_type new_value_type() { // function used above
return value_type(new value_type::element_type());
}
};
但是,如果您想要的是在Foo中使用向量成员从外部数据初始化而不复制它,而不是通过shared_ptr实际共享,那么我根本不会使用shared_ptr。在Foo的ctor中引用并记录它改变了对象。
struct Foo {
typedef std::vector<int> value_type;
explicit Foo(value_type& val) {
using std::swap;
swap(val, _val);
}
private:
value_type _val;
};
int main() {
Foo::value_type val;
val->push_back(123);
Foo foo(val);
return 0;
}
答案 1 :(得分:1)
提供的示例中没有深层副本。 shared_ptr被复制,但只创建了一个向量。您可以通过在Foo构造函数之后第二次调用push_back并注意到Foo.val_也发生更改来确认这一点。