+template <typename Void, typename Container, typename... Args>
+struct padded_emplace_back_or_push_back_ {
+ static decltype(auto) go(Container& container, Args&&... args) {
+ using Value = typename Container::value_type;
+ return container.push_back(Value(std::forward<Args>(args)...));
+ }
+};
+
+template <typename Container, typename... Args>
+struct padded_emplace_back_or_push_back_<
+ void_t<decltype(
+ std::declval<Container&>().emplace_back(std::declval<Args>()...))>,
+ Container,
+ Args...> {
+ static decltype(auto) go(Container& container, Args&&... args) {
+ return container.emplace_back(std::forward<Args>(args)...);
+ }
+};
+
+template <typename Container, typename... Args>
+decltype(auto) padded_emplace_back_or_push_back(
+ Container& container,
+ Args&&... args) {
+ using impl = padded_emplace_back_or_push_back_<void, Container, Args...>;
+ return impl::go(container, std::forward<Args>(args)...);
+}
+