#include <stdio.h>
namespace named
{
template<typename RandomIt>
void sort_it_it(RandomIt first, RandomIt last)
{
(void) last;
(void) (first + 1);
(void) (bool(*first < *first));
// stuff...
}
template<typename Container, typename Compare>
void sort_cont_cmp(Container& c, Compare cmp)
{
typename Container::iterator b = c.begin(), e = c.end();
(void) e;
(void) (b + 1);
(void) (bool(cmp(*b, *b)));
// stuff...
}
}
namespace overloaded
{
template<typename RandomIt>
void sort(RandomIt first, RandomIt last)
{
puts("sort(RandomIt, RandomIt)");
named::sort_it_it(first, last);
}
template<typename Container, typename Compare>
void sort(Container& c, Compare cmp)
{
puts("sort(Container&, Compare)");
named::sort_cont_cmp(c, cmp);
}
}
struct BadContCmp { // Not complete. Bad.
int x[10];
BadContCmp() { for (int i = 0; i < 10; ++i) x[i] = 42; } // LOL.
typedef int * iterator;
iterator begin() { return x; }
iterator end() { return x + 10; }
typedef bool result_type;
typedef int first_argument_type;
typedef int second_argument_type;
bool operator()(int const& a, int const& b) const { return a < b; }
};
int main()
{
BadContCmp contcmp;
named::sort_it_it(contcmp.begin(), contcmp.end()); // ok (of course)
named::sort_cont_cmp(contcmp, contcmp); // ok (of course)
overloaded::sort(contcmp.begin(), contcmp.end()); // ok
//overloaded::sort(contcmp, contcmp); // error (inside the body of sort_it_it)
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgpuYW1lc3BhY2UgbmFtZWQKewoJdGVtcGxhdGU8dHlwZW5hbWUgUmFuZG9tSXQ+Cgl2b2lkIHNvcnRfaXRfaXQoUmFuZG9tSXQgZmlyc3QsIFJhbmRvbUl0IGxhc3QpCgl7CgkJKHZvaWQpIGxhc3Q7CgkJKHZvaWQpIChmaXJzdCArIDEpOwoJCSh2b2lkKSAoYm9vbCgqZmlyc3QgPCAqZmlyc3QpKTsKCQkvLyBzdHVmZi4uLgoJfQoJCgl0ZW1wbGF0ZTx0eXBlbmFtZSBDb250YWluZXIsIHR5cGVuYW1lIENvbXBhcmU+Cgl2b2lkIHNvcnRfY29udF9jbXAoQ29udGFpbmVyJiBjLCBDb21wYXJlIGNtcCkKCXsKCQl0eXBlbmFtZSBDb250YWluZXI6Oml0ZXJhdG9yIGIgPSBjLmJlZ2luKCksIGUgPSBjLmVuZCgpOwoJCSh2b2lkKSBlOwoJCSh2b2lkKSAoYiArIDEpOwoJCSh2b2lkKSAoYm9vbChjbXAoKmIsICpiKSkpOwoJCS8vIHN0dWZmLi4uCgl9Cn0KCm5hbWVzcGFjZSBvdmVybG9hZGVkCnsKCXRlbXBsYXRlPHR5cGVuYW1lIFJhbmRvbUl0PgoJdm9pZCBzb3J0KFJhbmRvbUl0IGZpcnN0LCBSYW5kb21JdCBsYXN0KQoJewoJCXB1dHMoInNvcnQoUmFuZG9tSXQsIFJhbmRvbUl0KSIpOwoJCW5hbWVkOjpzb3J0X2l0X2l0KGZpcnN0LCBsYXN0KTsKCX0KCQoJdGVtcGxhdGU8dHlwZW5hbWUgQ29udGFpbmVyLCB0eXBlbmFtZSBDb21wYXJlPgoJdm9pZCBzb3J0KENvbnRhaW5lciYgYywgQ29tcGFyZSBjbXApCgl7CgkJcHV0cygic29ydChDb250YWluZXImLCBDb21wYXJlKSIpOwoJCW5hbWVkOjpzb3J0X2NvbnRfY21wKGMsIGNtcCk7Cgl9Cn0KCnN0cnVjdCBCYWRDb250Q21wIHsgLy8gTm90IGNvbXBsZXRlLiBCYWQuCglpbnQgeFsxMF07CgkKCUJhZENvbnRDbXAoKSB7IGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkgeFtpXSA9IDQyOyB9IC8vIExPTC4KCQoJdHlwZWRlZiBpbnQgKiBpdGVyYXRvcjsKCWl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4geDsgfQoJaXRlcmF0b3IgZW5kKCkgICB7IHJldHVybiB4ICsgMTA7IH0KCQoJdHlwZWRlZiBib29sIHJlc3VsdF90eXBlOwoJdHlwZWRlZiBpbnQgZmlyc3RfYXJndW1lbnRfdHlwZTsKCXR5cGVkZWYgaW50IHNlY29uZF9hcmd1bWVudF90eXBlOwoJYm9vbCBvcGVyYXRvcigpKGludCBjb25zdCYgYSwgaW50IGNvbnN0JiBiKSBjb25zdCB7IHJldHVybiBhIDwgYjsgfQp9OwoKaW50IG1haW4oKQp7CglCYWRDb250Q21wIGNvbnRjbXA7CgkKCW5hbWVkOjpzb3J0X2l0X2l0KGNvbnRjbXAuYmVnaW4oKSwgY29udGNtcC5lbmQoKSk7IC8vIG9rIChvZiBjb3Vyc2UpCgluYW1lZDo6c29ydF9jb250X2NtcChjb250Y21wLCBjb250Y21wKTsgLy8gb2sgKG9mIGNvdXJzZSkKCQoJb3ZlcmxvYWRlZDo6c29ydChjb250Y21wLmJlZ2luKCksIGNvbnRjbXAuZW5kKCkpOyAvLyBvawoJLy9vdmVybG9hZGVkOjpzb3J0KGNvbnRjbXAsIGNvbnRjbXApOyAvLyBlcnJvciAoaW5zaWRlIHRoZSBib2R5IG9mIHNvcnRfaXRfaXQpCn0=