It would be useful if "using" aliases could be expanded beyond namespaces and types. Why not provide aliases for class members? This would be useful if you wanted to derive a class from a standard type such as pair or tuple, but wanted more meaningful member names than the built-in .first, .second, etc, names. In effect, a way to easily "rename" a member.
The member alias syntax would look like:
class X { ...
using NewName = ExistingName;
where ExistingName is an existing member variable or member function in a class. The implemention would treat NewName like a macro, and substitute ExistingName wherever NewName appears. ExistingName could also specify a function, e.g., "ExistingName()", in which case NewName becomes a property-like element.
Examples:You could derive from a std::pair, then alias different names to the .first and .second members of the pair.
struct Gps_Pos : pair<double,double> {
using latitude = first;
using longitude = second;
};
Gps_Pos gps;
gps.latitude = 12.34; //sets gps.first
Another possibility could be to alias names to certain elements of an array. Thus, an N-dimensional array could provide names for each dimension.
struct Vec3d{
double data[3];
using x = data[0];
using y = data[1];
using z = data[2];
};
Vec3d v;
v.z = 123; // sets data[2]
Member aliases could also be used to shorten inconveniently long names:
struct My_Database{
int GetNumberOfCustomersCurrentlyActive(){
...
}
using custs = GetNumberOfCustomersCurrentlyActive;
};
My_Database db;
cout << db.custs() ; // calls db.GetNumberOfCustomersCurrentlyActive()
Finally, member aliases could be used to access elements of a tuple through meaningful names. This brings tuples one step closer to being a struct replacement, with all the extra features that a tuple provides.
struct Person : tuple<string,int>{
string& get0(){return std::get<0>(*this);}
int& get1(){return std::get<1>(*this);}
using name = get0();
using age = get1();
};
Person p;
p.name = "Bob"; //sets via get<0>(p)
----
Cheers,
Derek