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
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;
}