1 // PR c++/61647
2 
3 class XX;
4 
5 template<typename Container, typename Key>
6 struct Accessor;
7 
8 template<typename Container, typename Key, typename KeyStore = Key>
9 class Variant {
10 protected:
11     KeyStore index;
12     Container state;
13 public:
Variant(Container st,const Key & i)14     Variant(Container st, const Key& i) : index(i), state(st) {}
15 
16     template<typename T>
T()17     operator T() const {
18         return Accessor<Container, KeyStore>::template get<T>(state, index);
19     }
20 };
21 
22 class AutoCleanVariant : public Variant<XX*, int> {
23 public:
AutoCleanVariant(XX * st,int i)24     AutoCleanVariant(XX* st, int i) : Variant<XX*,int>(st,i) {}
25 
26     template<typename T>
T()27     operator T() const {
28          return Variant<XX*, int>::operator T();
29     }
30 };
31