uso lenguaje ejemplos dev define declarar constint constantes como calificador c++

lenguaje - ¿Cuándo has usado la palabra clave ''mutable'' de C++?



lenguaje c define (10)

En los objetos simulados para capturar el valor de los argumentos de las funciones const en una variable miembro.

class Source { public: virtual ~Source() {} virtual std::string read(int count) const=0; }; class SourceMock : public Source { public: mutable std::vector<int> arguments; std::string read(int count) const { arguments.push_back(count); return "..."; } }; //TEST.... SourceMock mock; //... VERIFY(mock.arguments.size()==2); VERIFY(mock.arguments[0]==3); //...

¿Cuándo has usado la palabra clave mutable C ++? ¿y por qué? No creo que haya tenido que usar esa palabra clave. Entiendo que se usa para cosas como el almacenamiento en caché (o quizás la memorización) pero, ¿en qué clase y condición ha necesitado usarlo?


He usado mutable en caso de resultados de almacenamiento en caché de objetos calculados a partir de miembros internos:

class Transformation { private: vec3 translation; vec3 scale; vec4 rotation; mutable mat4 transformation; mutable bool changed; public: Node() { [...] changed = false; } void set_translation(vec3 _translation) { translation = _translation; changed = true; } void set_scale(...) ... mat4 get_transformation() const { if(changed) { // transformation and changed need to be mutable here transformation = f(translation, scale, rotation); // This take a long time... changed = false; } return transformation; } }; void apply_tranformation(const Transformation* transfo) { apply(transfo->get_transformation()); }


La palabra clave mutable le permite modificar una variable dentro de un contexto constante

p.ej:

class Person { private: mutable int age; public: Person(int age) : age(age) { } void setAge(int age) const { Person::age = age; } int getAge() const { return Person::age; } }; int main() { Person person(23); std::cout << "Person age " << person.getAge() << std::endl; person.setAge(24); std::cout << "Person modified age " << person.getAge() << std::endl; return 0; }


Lo uso al bloquear un mutex para seguridad de subprocesos. El mutex está marcado como mutable, por lo que los métodos que lo bloquean pueden permanecer constantes.


Mi clase de plantilla implementa patrón de referencia de contador. Cuando se pasa a funciones como argumento con modificador const , es posible que la referencia pueda aumentarse de todos modos. Así que en lugar de const_cast se puede usar mutable.


Ocasionalmente, lo uso para marcar un mutex u otra primitiva de sincronización de subprocesos como mutables, de modo que los métodos de consulta / acceso, que normalmente están marcados como const , aún pueden bloquear el mutex.

En ocasiones, también es útil cuando necesita instrumentar su código para fines de depuración o prueba, ya que la instrumentación a menudo necesita modificar datos auxiliares desde métodos de consulta internos.


Se puede utilizar en muchos escenarios, por ejemplo,

Loggers , timing , access counters , etc.

Estos pueden llamarse en accesos constantes sin cambiar el estado de los datos.


Utilizo mutable para miembros de clase que se inicializan bajo demanda, especialmente desde una base de datos o fuente externa al programa. Esto permite que las funciones "getter" creen el objeto a pedido, de lo contrario es un método constante.


Búsqueda de código de Google revela una serie de usos. Por ejemplo, en una implementación de criptografía XTR , los miembros mutables se utilizan para que los métodos puedan devolver una referencia a un resultado (lo que evita que se realicen copias).

Para otro ejemplo, Webkit usa para inicializar perezosamente los datos de miembros (m_lineHeight).