#include <iostream>
#include <type_traits>
#include <typeinfo>
using namespace std;
template <typename A,typename B>
struct basic_storage
{
using a_type = A;
using b_type = B;
static constexpr bool value = b_type::value;
};
template
<
template <typename, typename>
class storage_t,
typename T,
typename is_allocated
>
class Buffer : public storage_t<T, is_allocated> {
public:
using storage_type = storage_t<T, is_allocated>;
};
template
<
template <typename, typename>
class storage_t,
typename T /*= storage::UnknownType*/,
typename is_allocated = std::false_type
>
class Example_Buffer
: public Buffer<storage_t, T, is_allocated> {
public:
constexpr Example_Buffer(
/*typename storage_t<T, is_allocated>::iterator it*/) {
//using the members with the injected class name..
using b_type = typename Example_Buffer::b_type;
// or directly using injected class name..
std::cout << typeid(typename Example_Buffer::a_type).name() << std::endl;
std::cout << Example_Buffer::value << std::endl;
// using storage_type defined in Buffer<...>
using storage_type = typename Example_Buffer::storage_type;
std::cout << typeid(typename storage_type::a_type).name() << std::endl;
std::cout << storage_type::b_type::value << std::endl;
std::cout << storage_type::value << std::endl;
}
};
int main() {
Example_Buffer<basic_storage,int,std::true_type>{};
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDx0eXBlaW5mbz4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgQSx0eXBlbmFtZSBCPgpzdHJ1Y3QgYmFzaWNfc3RvcmFnZQp7Cgl1c2luZyBhX3R5cGUgPSBBOwoJdXNpbmcgYl90eXBlID0gQjsKCXN0YXRpYyBjb25zdGV4cHIgYm9vbCB2YWx1ZSA9IGJfdHlwZTo6dmFsdWU7Cn07CgoKdGVtcGxhdGUKPAogICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZT4KICAgICAgICBjbGFzcyBzdG9yYWdlX3QsCiAgICB0eXBlbmFtZSBULAogICAgdHlwZW5hbWUgaXNfYWxsb2NhdGVkCj4KY2xhc3MgQnVmZmVyIDogcHVibGljIHN0b3JhZ2VfdDxULCBpc19hbGxvY2F0ZWQ+IHsKCQoJcHVibGljOgoJdXNpbmcgc3RvcmFnZV90eXBlID0gc3RvcmFnZV90PFQsIGlzX2FsbG9jYXRlZD47Cn07Cgp0ZW1wbGF0ZQo8CiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lPgogICAgICAgIGNsYXNzIHN0b3JhZ2VfdCwKICAgIHR5cGVuYW1lIFQgLyo9IHN0b3JhZ2U6OlVua25vd25UeXBlKi8sCiAgICB0eXBlbmFtZSBpc19hbGxvY2F0ZWQgPSBzdGQ6OmZhbHNlX3R5cGUKPgpjbGFzcyBFeGFtcGxlX0J1ZmZlcgo6IHB1YmxpYyBCdWZmZXI8c3RvcmFnZV90LCBULCBpc19hbGxvY2F0ZWQ+IHsKCXB1YmxpYzoKICAgIGNvbnN0ZXhwciBFeGFtcGxlX0J1ZmZlcigKICAgICAgICAvKnR5cGVuYW1lIHN0b3JhZ2VfdDxULCBpc19hbGxvY2F0ZWQ+OjppdGVyYXRvciBpdCovKSB7CiAgICAgICAgCQogICAgICAgIAkvL3VzaW5nIHRoZSBtZW1iZXJzIHdpdGggdGhlIGluamVjdGVkIGNsYXNzIG5hbWUuLgogICAgICAgIAl1c2luZyBiX3R5cGUgPSB0eXBlbmFtZSBFeGFtcGxlX0J1ZmZlcjo6Yl90eXBlOwoKCQkJLy8gb3IgZGlyZWN0bHkgdXNpbmcgaW5qZWN0ZWQgY2xhc3MgbmFtZS4uCiAgICAgICAgCXN0ZDo6Y291dCA8PCB0eXBlaWQodHlwZW5hbWUgRXhhbXBsZV9CdWZmZXI6OmFfdHlwZSkubmFtZSgpIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAJc3RkOjpjb3V0IDw8IEV4YW1wbGVfQnVmZmVyOjp2YWx1ZSA8PCBzdGQ6OmVuZGw7CiAgICAgICAgCQogICAgICAgIAkvLyB1c2luZyBzdG9yYWdlX3R5cGUgZGVmaW5lZCBpbiBCdWZmZXI8Li4uPgogICAgICAgIAl1c2luZyBzdG9yYWdlX3R5cGUgPSB0eXBlbmFtZSBFeGFtcGxlX0J1ZmZlcjo6c3RvcmFnZV90eXBlOwogICAgICAgIAkKICAgICAgICAJc3RkOjpjb3V0IDw8IHR5cGVpZCh0eXBlbmFtZSBzdG9yYWdlX3R5cGU6OmFfdHlwZSkubmFtZSgpIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAJc3RkOjpjb3V0IDw8IHN0b3JhZ2VfdHlwZTo6Yl90eXBlOjp2YWx1ZSA8PCBzdGQ6OmVuZGw7CiAgICAgICAgCXN0ZDo6Y291dCA8PCBzdG9yYWdlX3R5cGU6OnZhbHVlIDw8IHN0ZDo6ZW5kbDsKCQogICAgICAgIH0KfTsKCgppbnQgbWFpbigpIHsKCUV4YW1wbGVfQnVmZmVyPGJhc2ljX3N0b3JhZ2UsaW50LHN0ZDo6dHJ1ZV90eXBlPnt9OwoJcmV0dXJuIDA7Cn0=