Search code examples
c++templatesgeneric-programmingtemplate-templates

Can I return a templated container of different type?


How can I create a function which behaves like this? I can't seem to declare the return type correctly.

template <typename C, typename T0, typename T1>
typename C<T1> 
convert_container(const C<T0>& container, T1 value) {
  C<T1> new_container;
  // Do some stuff...
  return new_container;
}

std::vector<int> vec0;
const auto& vec1 = convert_container(vec0, float(2.0f)); // Produce a vector of floats

std::list<int> lst0;
const auto& lst1 = convert_container(lst0, float(2.0f)); // Produce a list of floats

Solution

  • The correct way is to use template template parameter:

    • C++11:

      template <template<typename...> class C, typename T0, typename T1>
      C<T1> convert_container(const C<T0>& container, T1 value) {
        C<T1> new_container;
        // Do some stuff...
        return new_container;
      }
      
    • C++03 (with allocator rebind):

      template <template<typename, typename> class C, typename T0, typename T1, typename Alloc>
      C<T1, typename Alloc::template rebind<T1>::other>
      convert_container(const C<T0, Alloc>& container, T1 value) {
        C<T1, typename Alloc::template rebind<T1>::other> new_container;
        // Do some stuff...
        return new_container;
      }
      
    • C++03 (without rebind):

      template <template<typename, typename> class C, typename T0, typename T1, typename Alloc>
      C<T1, std::allocator<T1> > convert_container(const C<T0, Alloc>& container, T1 value) {
        C<T1, std::allocator<T1> > new_container;
        // Do some stuff...
        return new_container;
      }