#include #include #include #include #include #include #include namespace details { template auto prepend(Container& container, T&& value, int, int) -> decltype( container.push_front(value), std::declval() ) { container.push_front(std::forward(value)); } template auto prepend(Container& container, T&& value, int, float) -> decltype( container = value + container, std::declval() ) { container = std::forward(value) + container; } template auto prepend(Container& container, T&& value, float, float) -> decltype( container.insert(container.begin(), value), std::declval() ) { container.insert(container.begin(), std::forward(value)); } } template void prepend(Container& container, T&& value) { details::prepend(container, std::forward(value), 0, 0); } int main() { std::vector v { 1, 2, 3 }; assert(v.front() == 1); prepend(v, 0); assert(v.front() == 0); std::list d { 1.2f, 3.45f, 67.8f, 9.0f }; assert(d.front() == 1.2f); prepend(d, 0); assert(d.front() == 0.0f); std::string s { "ello world!" }; assert(s.front() == 'e'); prepend(s, 'H'); assert(s.front() == 'H'); }