非const对象的Const向量

时间:2011-07-25 16:59:38

标签: c++ vector const const-correctness

在界面中定义函数时:

virtual void ModifyPreComputedCoeffs ( std::vector < IndexCoeffPair_t > & model_ ) = 0;

我们要指定不应该在push_back等意义上改变向量model_操作不应该对向量进行操作,但是可以更改model_中的IndexCoeffPair_t结构对象。 我们该如何指定?

virtual void ModifyPreComputedCoeffs ( const std::vector < IndexCoeffPair_t > & model_ ) = 0;
我认为

不起作用。

6 个答案:

答案 0 :(得分:17)

不是将向量传递给函数,而是执行标准库的操作并改为传递一对迭代器。

virtual void ModifyPreComputedCoeffs ( std::vector < IndexCoeffPair_t >::iterator & model_begin, std::vector < IndexCoeffPair_t >::iterator & model_end )

答案 1 :(得分:9)

C ++ const-correctness概念被IMO高估了。你刚才发现的是它有一个很大的局限性:它不能按构图进行扩展。 为了能够创建非const对象的const向量,您需要实现自己的向量类型。请注意,例如,即使标准库也必须为const_iterators引入新类型。

我的建议是在你被迫的地方使用const-correctness,而不是在任何地方你都可以。理论上,const正确性应该对程序员有帮助,但由于语法的原因而且成本非常高,而且非常原始(只有一点,不能按组合扩展,甚至需要代码重复)。

同样根据我的经验,这个所谓的大帮助并不是那么大......它捕获的大多数错误都与const-correctness机器本身有关,而不是程序逻辑。

有没有想过为什么大多数语言(包括在C ++之后设计的语言)没有实现这个想法?

答案 2 :(得分:2)

这可能在C ++ 14中为std::dynarray

实际上,如果在编译时修改了大小,您可以使用std::array。但它可能更多地用于嵌入式编程,缓冲区,矩阵等等,因为通常你不知道所需的大小,直到运行时或你希望它是可配置的。

答案 3 :(得分:1)

如果你能够修改IndexCoeffPair_t,你可以添加一些const成员函数,并使用它们通过使用mutable关键字使成员可变来改变它的一些成员。这有点像黑客,因为你现在可以改变任何const IndexCoeffPair_t的内容。

示例:

class IndexCoeffPair_t {
public:
    void changeX(int newVal) const {
        x = newVal;
    }

private:
    mutable int x;
};

答案 4 :(得分:1)

您可以尝试创建const std::vector<YouType*>。这样就无法更改向量,但可以更改向量内的对象。 但要准确,因为您将修改原始对象而不是副本。

使用智能指针或原始指针取决于您的用例:您拥有观察者向量还是只有观察者向量。

答案 5 :(得分:0)

以下是MahlerFive回答的通用版本:

template<typename T>
class Mutable {
    mutable T m_val;
public:
    constexpr Mutable(T const& val) : m_val(val) { }
    constexpr Mutable(T&& val) : m_val(val) { }

    // note: all member functions are `const`
    constexpr Mutable const& operator=(T const& val) const {
        m_val = val;
        return *this;
    }
    constexpr Mutable const& operator=(T&& val) const {
        m_val = val;
        return *this;
    }

    constexpr operator T&() const {
        return m_val;
    }
};

然后,您可以在代码中使用std::vector<Mutable<T>> const,这通常会达到预期的效果。