我的项目中有以下类:Neuron
,ActivationNeuron
,Layer
和ActivationLayer
,如下所述。
class Neuron { }; /* abstract class */
class ActivationNeuron : public Neuron { };
class Layer {
protected:
vector<shared_ptr<Neuron>> neurons;
public:
Neuron& operator[](const int index) {
return *this->neurons[index];
}
};
class ActivationLayer : public Layer {
public:
ActivationNeuron& operator[](const int index) {
return *static_pointer_cast<ActivationNeuron>(this->neurons[index]);
}
};
我有以下两个问题:
实施/语法相关:图层现在使用shared_ptr
个神经元。如果我计划使用unique_ptr
而我的实施应该如何改变,因为static_pointer_cast
无法使用unique_ptr
?
语义相关:在这种情况下我应该使用unique_ptr
,因为其他类(包括我的测试用例)中的代码经常调用索引操作符来调用ActivationNeuron
参考上的函数?
更多语义:只要Layer
实例在范围内(没有延迟日志记录),就可以保证只使用数据。如果我选择返回pointer<Neuron>
和pointer<ActivationNeuron>
而不是引用,那么指针类型的决定如何受到影响?我更关注移动/复制语义和所有权政策,而不是(非剧烈的)效果。
我也欢迎改进我目前的实施。
答案 0 :(得分:2)
根据http://www.cplusplus.com/reference/memory/static_pointer_cast/你所拥有的相当于
return *static_cast<ActivationNeuron*>(this->neurons[index].get());
上述声明也适用于unique_ptr。
在语义方面,您正在更改所有权模型。在任何人都能抓住指针之前。现在他们将被绑定到Layer
。如果所有用法都存在Layer
,那么应该没问题。如果在销毁Layer
之后需要一些组件来访问数据(比如延迟日志记录),那么您将遇到问题。
如果有任何问题,不知道较大的应用程序很难说。
性能明智:静态强制转换,索引和.get()几乎是微不足道的(O(1)复杂性,只是内存索引),我不会太担心它们的性能。您可以执行配置文件以确保在您的应用程序中出现这种情况。与vector<Neuron*>
相比,你肯定只会略微恶化。