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