Вы не можете перегрузить .
, это правильно.Вы можете, однако, перегрузить ->
, если это тоже вариант для вас?
operator->
должен возвращать тип, который сам поддерживает operator->
, например, для этого подходит необработанный указатель:
template <bool T> struct A
{
struct B
{
int x;
double y;
};
struct C
{
char c;
std::string k;
};
using type = std::conditional<T, B, C>::type;
type b;
type* operator->() { return &b; }
};
Вы можете использовать его следующим образом:
int main()
{
A<true> object_1;
A<false> object_2;
cout << object_1->x;
cout << object_2->k;
}