#include <vector>
#include <memory>
#include <iostream>
#include <typeinfo>
using namespace std;
template <class TIteratorToPointerContainer>
class Something
{
public:
typedef typename TIteratorToPointerContainer::value_type TPointer;
typedef typename TPointer::element_type TValue;
};
int main()
{
Something<
typename std::vector< std::shared_ptr<int> >::iterator
>::TPointer pointer;
// "pointer" is of type std::shared_ptr<int>
Something<
typename std::vector< std::shared_ptr<int> >::iterator
>::TValue value;
// "value" is of type int
std::cout << "pointer-name = " << typeid(pointer).name() << endl;
std::cout << "value-name = " << typeid(value).name() << endl;
return 0;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZSA8Y2xhc3MgVEl0ZXJhdG9yVG9Qb2ludGVyQ29udGFpbmVyPgpjbGFzcyBTb21ldGhpbmcKewpwdWJsaWM6CiAgICB0eXBlZGVmIHR5cGVuYW1lIFRJdGVyYXRvclRvUG9pbnRlckNvbnRhaW5lcjo6dmFsdWVfdHlwZSBUUG9pbnRlcjsKICAgIHR5cGVkZWYgdHlwZW5hbWUgVFBvaW50ZXI6OmVsZW1lbnRfdHlwZSAgICAgICAgVFZhbHVlOwp9OwoKaW50IG1haW4oKQp7CiAgICBTb21ldGhpbmc8CiAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8IHN0ZDo6c2hhcmVkX3B0cjxpbnQ+ID46Oml0ZXJhdG9yIAogICAgICAgICAgICAgID46OlRQb2ludGVyIHBvaW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAvLyAicG9pbnRlciIgaXMgb2YgdHlwZSBzdGQ6OnNoYXJlZF9wdHI8aW50PgogICAgU29tZXRoaW5nPCAKICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnZlY3Rvcjwgc3RkOjpzaGFyZWRfcHRyPGludD4gPjo6aXRlcmF0b3IgCiAgICAgICAgICAgICAgPjo6VFZhbHVlIHZhbHVlOwogICAgICAgICAgICAgICAgICAgIC8vICJ2YWx1ZSIgaXMgb2YgdHlwZSBpbnQKCiAgc3RkOjpjb3V0IDw8ICJwb2ludGVyLW5hbWUgPSAiIDw8IHR5cGVpZChwb2ludGVyKS5uYW1lKCkgPDwgZW5kbDsKICBzdGQ6OmNvdXQgPDwgInZhbHVlLW5hbWUgPSAiIDw8IHR5cGVpZCh2YWx1ZSkubmFtZSgpIDw8IGVuZGw7CiAgICByZXR1cm4gMDsKfQ==