#include <vector>
#include <algorithm>
#include <iostream>
#include <iterator>

template< typename T, typename ...U >
std::vector<T> my_unique( std::vector<T> & cont, std::vector<U> &... other_containers )
{
    std::vector<T> destination{};
    auto uniq = []( std::vector<T> & arg )->typename std::vector<T>::iterator { std::sort(arg.begin(), arg.end() ); 
    return std::unique( std::begin( arg ), std::end( arg ) ); };
    auto coppy = [&]( std::vector<T> & args )-> void { std::copy( std::begin( args ), uniq( args ), std::back_inserter( destination ) ); };

    int hack[]{( void( coppy( cont ) ), 0 ), ( void( coppy( other_containers )), 0)... };
    return destination;
}

int main()
{
    std::vector<int> a { 11, 12, 11, 15, 16, 23, 15, 23, 15 }, b { 3, 5, 6, 2, 3, 4, 3, 8, 9, 8 }, c { 1, 1, 3, 6, 60, 2, 2, 1 };
    std::vector<int> d = my_unique( a, b, c );
    for( const auto &x: d ) std::cout << x << ", ";
    return 0;
}