#include <iostream>
#include <algorithm>
#include <vector>
namespace N
{
template <class T>
struct ItBase
{
template <class SomeN2>
friend SomeN2 copy(T first, T last, SomeN2 d_first)
{
first.some_member();
last.some_member();
return d_first;
}
};
struct A : ItBase<A>{ void some_member() { std::cout << "member of A" << std::endl; } };
struct B : ItBase<B>{ void some_member() { std::cout << "member of B" << std::endl; } };
struct C : ItBase<C>{ void some_member() { std::cout << "member of C" << std::endl; } };
}
template<class It1, class It2>
void do_something(It1 first, It1 second, It2 d_first)
{
using std::copy;
copy(first, second, d_first);
}
int main(){
N::A a1, a2, a3;
std::cout << "do something in N:" << std::endl;
do_something(a1, a2, a3);
N::B b1, b2, b3;
std::cout << "do something else in N:" << std::endl;
do_something(b1, b2, b3);
std::vector<int> v = {1,2,3};
std::vector<int> v2(3);
std::cout << "do something in std:" << std::endl;
do_something(std::begin(v), std::end(v), std::begin(v2));
for (int i : v2)
std::cout << i;
std::cout << std::endl;
}