#include <iostream>
#include <memory>
#include <vector>
#include <type_traits>
namespace detail
{
template<typename T>
using enable_pointer = std::enable_if<std::is_pointer<T>::value, T>;
}
template<typename T>
auto ptrOf(T & data) -> typename detail::enable_pointer<decltype(&(*data))>::type
{
return &(*data);
}
template<typename T>
auto ptrOf(T & data) -> typename detail::enable_pointer<decltype(data.data())>::type
{
return data.data();
}
template<typename T>
auto ptrOf(T & data) -> typename detail::enable_pointer<decltype(data.begin())>::type
{
return data.begin();
}
template<typename T>
auto ptrOf(T & data) -> typename detail::enable_pointer<decltype(data.ptr())>::type
{
return data.ptr();
}
using namespace std;
int main()
{
vector<int> v{1,2};
auto i(++v.begin());
unique_ptr<int> u(new int(3));
initializer_list<int> l{4,5};
const int * p = ptrOf(l) + 1;
cout << *ptrOf(v) << endl;
cout << *ptrOf(i) << endl;
cout << *ptrOf(u) << endl;
cout << *ptrOf(l) << endl;
cout << *ptrOf(p) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CgpuYW1lc3BhY2UgZGV0YWlsCnsKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICB1c2luZyBlbmFibGVfcG9pbnRlciA9IHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfcG9pbnRlcjxUPjo6dmFsdWUsIFQ+Owp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgphdXRvIHB0ck9mKFQgJiBkYXRhKSAtPiB0eXBlbmFtZSBkZXRhaWw6OmVuYWJsZV9wb2ludGVyPGRlY2x0eXBlKCYoKmRhdGEpKT46OnR5cGUKewogICAgcmV0dXJuICYoKmRhdGEpOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgphdXRvIHB0ck9mKFQgJiBkYXRhKSAtPiB0eXBlbmFtZSBkZXRhaWw6OmVuYWJsZV9wb2ludGVyPGRlY2x0eXBlKGRhdGEuZGF0YSgpKT46OnR5cGUKewogICAgcmV0dXJuIGRhdGEuZGF0YSgpOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgphdXRvIHB0ck9mKFQgJiBkYXRhKSAtPiB0eXBlbmFtZSBkZXRhaWw6OmVuYWJsZV9wb2ludGVyPGRlY2x0eXBlKGRhdGEuYmVnaW4oKSk+Ojp0eXBlCnsKICAgIHJldHVybiBkYXRhLmJlZ2luKCk7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmF1dG8gcHRyT2YoVCAmIGRhdGEpIC0+IHR5cGVuYW1lIGRldGFpbDo6ZW5hYmxlX3BvaW50ZXI8ZGVjbHR5cGUoZGF0YS5wdHIoKSk+Ojp0eXBlCnsKICAgIHJldHVybiBkYXRhLnB0cigpOwp9Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IG1haW4oKQp7CiAgICB2ZWN0b3I8aW50PiB2ezEsMn07CiAgICBhdXRvIGkoKyt2LmJlZ2luKCkpOwogICAgdW5pcXVlX3B0cjxpbnQ+IHUobmV3IGludCgzKSk7CiAgICBpbml0aWFsaXplcl9saXN0PGludD4gbHs0LDV9OwogICAgY29uc3QgaW50ICogcCA9IHB0ck9mKGwpICsgMTsKCiAgICBjb3V0IDw8ICpwdHJPZih2KSA8PCBlbmRsOwogICAgY291dCA8PCAqcHRyT2YoaSkgPDwgZW5kbDsKICAgIGNvdXQgPDwgKnB0ck9mKHUpIDw8IGVuZGw7CiAgICBjb3V0IDw8ICpwdHJPZihsKSA8PCBlbmRsOwogICAgY291dCA8PCAqcHRyT2YocCkgPDwgZW5kbDsKCiAgICByZXR1cm4gMDsKfQo=