C ++ 11智能指针的索引向量作为类的成员

时间:2014-01-07 10:18:24

标签: c++ c++11 polymorphism shared-ptr unique-ptr

我的项目中有以下类:NeuronActivationNeuronLayerActivationLayer,如下所述。

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>而不是引用,那么指针类型的决定如何受到影响?我更关注移动/复制语义和所有权政策,而不是(非剧烈的)效果。

我也欢迎改进我目前的实施。

1 个答案:

答案 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*>相比,你肯定只会略微恶化。