Mouse input handler which exposes read-only mouse state data I have a MouseInputHandler class that registers itself to an InputManager. When the InputManager class receives events they are forwarded to MouseInputHandler which changes its state to reflect the state of the mouse. A mouse as an input device provides a large number of different properties that should be easy to read, but impossible to write to.

The problem is that C++ fails to provide a keyword otherwise similar to const but that grants full write access to functions in the same scope.

class MouseInputHandler : public InputHandler
{
public:
    MouseInputHandler(ResourceContext &amp;context)
        : btnLeft(btnLeft_), btnMiddle(btnMiddle_), btnRight(btnRight_),
          btnX1(btnX1_), btnX2(btnX2_), absX(absX_), absY(absY_), relX(relX_),
          relY(relY_), scrollX(scrollX_), scrollY(scrollY_) {}
    void handleEvent(SDL_Event &amp;mouseEvent);
    void refresh();

    const Signal &amp;btnLeft, &amp;btnMiddle, &amp;btnRight, &amp;btnX1, &amp;btnX2;
    const int32_t &amp;absX, &amp;absY, &amp;relX, &amp;relY, &amp;scrollX, &amp;scrollY;
protected:
    Signal btnLeft_, btnMiddle_, btnRight_, btnX1_, btnX2_;
    int32_t absX_, absY_, relX_, relY_, scrollX_, scrollY_;
};


Options I have identified at this point:


Declaring the members private or protected and providing public const references to the non-public members that only allow read access (as in the example above). However with 11 members, the class quicly becomes a mess, with 11 const references (that also require 11 reference initializations in the constructor's initializer list).
Adding getter methods for every member variable. More cumbersome than the const references, but with the (marginal) added benefit that the members are now accessible as functions.
Placing the buttons and integers in (private or protected) arrays and adding an enum that gives indexes to the array elements meaningful names. To access the members, two (one getter for buttons, other for ints) getter functions that take the index and return a const reference are added to the class. This seems to me quite complex and error prone in comparison to the other solutions.
Just not caring about const correctness at all and making the member variables fully accessible.
Refractoring the code. I don't see how one could refractor a mouse, or simplify the interface, but any suggestions are welcome.
You could represent the mouse state using a struct:

struct MouseSettings
{
    Signal btnLeft_, btnMiddle_, btnRight_, btnX1_, btnX2_;
    int32_t absX_, absY_, relX_, relY_, scrollX_, scrollY_;
}

class MouseInputHandler : public InputHandler
{
public:
    MouseInputHandler(ResourceContext &amp;context)
        : mouseSettings(mouseSettings_)
    {}
    void handleEvent(SDL_Event &amp;mouseEvent);
    void refresh();

    const MouseSettings&amp; mouseSettings;

protected:
    MouseSettings mouseSettings_;
};


Or a property-like get-accessor method like:

const MouseSettings&amp; getMouseSettings() { return mouseSettings_; }