Consider the following class:
class SocialPrefNode{
public:
// Constructors & Destructor
SocialPrefNode( );
SocialPrefNode( char self, int ind, int link, bool stack, std::vector<SocialPrefNode*> pref,
std::vector<SocialPrefNode*> worse, std::vector<SocialPrefNode*> indiff );
SocialPrefNode( const SocialPrefNode& copy );
~SocialPrefNode( );
// Setters
void set_id( char self );
void set_index( int ind );
void set_lowlink( int link );
void set_onstack( bool stack );
void set_pref( std::vector<SocialPrefNode*> prefs );
void set_pref( SocialPrefNode& prefs );
void set_worse( std::vector<SocialPrefNode*> wrs );
void set_worse( SocialPrefNode& wrs );
void set_indiff( std::vector<SocialPrefNode*> indiff );
void set_indiff( SocialPrefNode& indiff );
// Getters
char get_id( ){ return id; }
int get_index( ){ return index; }
int get_lowlink( ){ return lowlink; }
bool get_onstack( ){ return onstack; }
std::vector<SocialPrefNode*> get_preferences( ){ return preferences; }
std::vector<SocialPrefNode*> get_worse( ){ return worsethan; }
std::vector<SocialPrefNode*> get_indiff( ){ return indifference; }
// Operators
SocialPrefNode& operator=( const SocialPrefNode& copy );
private:
char id{ };
int index{ };
int lowlink{ };
bool onstack{ };
std::vector<SocialPrefNode*> preferences{ };
std::vector<SocialPrefNode*> worsethan{ };
std::vector<SocialPrefNode*> indifference{ };
};
std::ostream& operator<<( std::ostream& os, SocialPrefNode& node );
Question: Is there a way to overload/override/redefine the subscript operator s.t. one can, for example, have access to a vector of choice, among the three options.
I.e., suppose: SocialPrefNode ordering{ }
. I want to be able to use the subscript operator as in ordering[ i ]
AND be able to choose one, among the three vectors in the class, for the subscript/index i to act up on.
Example: one wants to access the third element in the preferences
vector of a SocialPrefNode ordering
. Then, one does ordering[ 2 ]
and, thus, have access to the desired element.
A possible solution is to use phantom types to wrap up the vector to use. I followed this blog post and came up with the following solution.
If you don't mind adding an external dependency, you can directly use the Github repo of the author of
NamedType
(where the class is a bit extended in comparison to here).