Доступ к членам данных члена данных (сам по себе является объектом), как если бы они были членами класса - PullRequest
0 голосов
/ 11 октября 2018

Учитывая scenerio,

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;
}

Я хотел бы получить доступ к таким элементам данных, как:

int main(){
    A<true> object_1;
    A<false> object_2;
    cout << object_1.x;
    cout << object_2.k;
}

Это было бы возможно, если бы оператор . (точка) мог бытьперегружен.Однако это невозможно (по крайней мере, сейчас).Есть ли обходной путь, чтобы пример работал?

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Кажется, это проще, чем я думал:

struct B{
    int x; 
    double y;
}
struct C{
   char c;
   std::string k;
}
template <bool T>
struct A : public std::conditional <T, B, C>::type{

}
0 голосов
/ 11 октября 2018

Вы не можете перегрузить ., это правильно.Вы можете, однако, перегрузить ->, если это тоже вариант для вас?

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;
}
...