#include <vector>
template <typename T, typename U>
struct is_same
{
enum { value = 0 };
};
template <typename T>
struct is_same<T, T>
{
enum { value = 1 };
};
template <bool, typename>
struct enable_if
{};
template <typename T>
struct enable_if<true, T>
{
typedef T type;
};
template <typename T>
struct ReadOnlyIterator
{
ReadOnlyIterator() {}
template <typename Container>
ReadOnlyIterator(const Container &v, typename enable_if<is_same<T, typename Container::value_type>::value, void>::type * = 0) {}
template <typename Container>
typename enable_if<is_same<T, typename Container::value_type>::value, ReadOnlyIterator<T>&>::type operator= (const Container &v) { return *this; }
};
int main()
{
ReadOnlyIterator<int> i;
std::vector<int> v;
std::vector<short> w;
i = v;
//i = w; //uncomment for error
ReadOnlyIterator<int> i2 = v;
//ReadOnlyIterator<int> j = w; //uncomment for error
}
I2luY2x1ZGUgPHZlY3Rvcj4KCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgpzdHJ1Y3QgaXNfc2FtZQp7CiAgICBlbnVtIHsgdmFsdWUgPSAwIH07Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IGlzX3NhbWU8VCwgVD4KewogICAgZW51bSB7IHZhbHVlID0gMSB9Owp9OwoKdGVtcGxhdGUgPGJvb2wsIHR5cGVuYW1lPgpzdHJ1Y3QgZW5hYmxlX2lmCnt9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBlbmFibGVfaWY8dHJ1ZSwgVD4KewogICAgdHlwZWRlZiBUIHR5cGU7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IFJlYWRPbmx5SXRlcmF0b3IKewogICAgUmVhZE9ubHlJdGVyYXRvcigpIHt9CiAgICAKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+CiAgICBSZWFkT25seUl0ZXJhdG9yKGNvbnN0IENvbnRhaW5lciAmdiwgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX3NhbWU8VCwgdHlwZW5hbWUgQ29udGFpbmVyOjp2YWx1ZV90eXBlPjo6dmFsdWUsIHZvaWQ+Ojp0eXBlICogPSAwKSB7fQogICAgCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgogICAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX3NhbWU8VCwgdHlwZW5hbWUgQ29udGFpbmVyOjp2YWx1ZV90eXBlPjo6dmFsdWUsIFJlYWRPbmx5SXRlcmF0b3I8VD4mPjo6dHlwZSBvcGVyYXRvcj0gKGNvbnN0IENvbnRhaW5lciAmdikgeyByZXR1cm4gKnRoaXM7IH0KfTsKCmludCBtYWluKCkKewogICAgUmVhZE9ubHlJdGVyYXRvcjxpbnQ+IGk7CiAgICBzdGQ6OnZlY3RvcjxpbnQ+IHY7CiAgICBzdGQ6OnZlY3RvcjxzaG9ydD4gdzsKICAgIGkgPSB2OwogICAgLy9pID0gdzsgLy91bmNvbW1lbnQgZm9yIGVycm9yCiAgICBSZWFkT25seUl0ZXJhdG9yPGludD4gaTIgPSB2OwogICAgLy9SZWFkT25seUl0ZXJhdG9yPGludD4gaiA9IHc7IC8vdW5jb21tZW50IGZvciBlcnJvcgp9