/** * @file VariadicBind.h * @ingroup SQLiteCpp * @brief Convenience function for Statement::bind(...) * * Copyright (c) 2016 Paul Dreik (github@pauldreik.se) * Copyright (c) 2016-2019 Sebastien Rombauts (sebastien.rombauts@gmail.com) * * Distributed under the MIT License (MIT) (See accompanying file LICENSE.txt * or copy at http://opensource.org/licenses/MIT) */ #pragma once #if (__cplusplus >= 201402L) || ( defined(_MSC_VER) && (_MSC_VER >= 1900) ) // c++14: Visual Studio 2015 #include /// @cond #include #include namespace SQLite { /// implementation detail for variadic bind. namespace detail { template inline void invoke_with_index(F&& f, std::integer_sequence, const Args& ...args) { std::initializer_list({ (f(I+1, args), 0)... }); } /// implementation detail for variadic bind. template inline void invoke_with_index(F&& f, const Args& ... args) { invoke_with_index(std::forward(f), std::index_sequence_for(), args...); } } // namespace detail /// @endcond /** * \brief Convenience function for calling Statement::bind(...) once for each argument given. * * This takes care of incrementing the index between each calls to bind. * * This feature requires a c++14 capable compiler. * * \code{.cpp} * SQLite::Statement stm("SELECT * FROM MyTable WHERE colA>? && colB=? && colC void bind(SQLite::Statement& s, const Args& ... args) { static_assert(sizeof...(args) > 0, "please invoke bind with one or more args"); auto f=[&s](std::size_t index, const auto& value) { s.bind(index, value); }; detail::invoke_with_index(f, args...); } } // namespace SQLite #endif // c++14