#include <vector>
#include <list>
#include <type_traits>
#include <iostream>
struct MyStruct
{
int value;
MyStruct(int value = 42) : value(value) { }
const int& getInt() const { return value; }
};
typedef std::list<MyStruct> StructList;
typedef std::vector<const MyStruct*> StructPtrVector;
template <typename ITER_TYPE>
auto getIteratorInt(ITER_TYPE iter) ->
typename std::enable_if< std::is_pointer<typename ITER_TYPE::value_type>::value,
const int& >::type
{
return (*iter)->getInt();
}
template <typename ITER_TYPE>
auto getIteratorInt(ITER_TYPE iter) ->
typename std::enable_if< ! std::is_pointer<typename ITER_TYPE::value_type>::value,
const int& >::type
{
return iter->getInt();
}
template <typename LIST_TYPE>
void PrintInts(const LIST_TYPE& intList)
{
for (auto iter = intList.begin(); iter != intList.end(); ++iter)
std::cout << getIteratorInt(iter) << std::endl;
}
int main(void)
{
StructList structList;
StructPtrVector structPtrs;
int values[5] = { 1, 4, 6, 4, 1 };
for (unsigned i = 0; i < 5; ++i)
{
structList.push_back(values[i]);
structPtrs.push_back(&structList.back());
}
PrintInts(structList);
PrintInts(structPtrs);
return 0;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IE15U3RydWN0CnsKICBpbnQgdmFsdWU7CiAgTXlTdHJ1Y3QoaW50IHZhbHVlID0gNDIpIDogdmFsdWUodmFsdWUpIHsgfQogIGNvbnN0IGludCYgZ2V0SW50KCkgY29uc3QgeyByZXR1cm4gdmFsdWU7IH0KfTsKCnR5cGVkZWYgc3RkOjpsaXN0PE15U3RydWN0PiBTdHJ1Y3RMaXN0Owp0eXBlZGVmIHN0ZDo6dmVjdG9yPGNvbnN0IE15U3RydWN0Kj4gU3RydWN0UHRyVmVjdG9yOwoKdGVtcGxhdGUgPHR5cGVuYW1lIElURVJfVFlQRT4KYXV0byBnZXRJdGVyYXRvckludChJVEVSX1RZUEUgaXRlcikgLT4KdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IHN0ZDo6aXNfcG9pbnRlcjx0eXBlbmFtZSBJVEVSX1RZUEU6OnZhbHVlX3R5cGU+Ojp2YWx1ZSwKICAgIGNvbnN0IGludCYgPjo6dHlwZQp7CiAgcmV0dXJuICgqaXRlciktPmdldEludCgpOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgSVRFUl9UWVBFPgphdXRvIGdldEl0ZXJhdG9ySW50KElURVJfVFlQRSBpdGVyKSAtPgp0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwgISBzdGQ6OmlzX3BvaW50ZXI8dHlwZW5hbWUgSVRFUl9UWVBFOjp2YWx1ZV90eXBlPjo6dmFsdWUsCiAgICBjb25zdCBpbnQmID46OnR5cGUKewogIHJldHVybiBpdGVyLT5nZXRJbnQoKTsKfQoKCnRlbXBsYXRlIDx0eXBlbmFtZSBMSVNUX1RZUEU+CnZvaWQgUHJpbnRJbnRzKGNvbnN0IExJU1RfVFlQRSYgaW50TGlzdCkKewogIGZvciAoYXV0byBpdGVyID0gaW50TGlzdC5iZWdpbigpOyBpdGVyICE9IGludExpc3QuZW5kKCk7ICsraXRlcikKICAgIHN0ZDo6Y291dCA8PCBnZXRJdGVyYXRvckludChpdGVyKSA8PCBzdGQ6OmVuZGw7Cn0KCmludCBtYWluKHZvaWQpCnsKICBTdHJ1Y3RMaXN0IHN0cnVjdExpc3Q7CiAgU3RydWN0UHRyVmVjdG9yIHN0cnVjdFB0cnM7CiAgaW50IHZhbHVlc1s1XSA9IHsgMSwgNCwgNiwgNCwgMSB9OwogIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCA1OyArK2kpCiAgewogICAgc3RydWN0TGlzdC5wdXNoX2JhY2sodmFsdWVzW2ldKTsKICAgIHN0cnVjdFB0cnMucHVzaF9iYWNrKCZzdHJ1Y3RMaXN0LmJhY2soKSk7CiAgfQogIFByaW50SW50cyhzdHJ1Y3RMaXN0KTsKICBQcmludEludHMoc3RydWN0UHRycyk7CgogIHJldHVybiAwOwp9Cg==