Require a BaseParameters type at compile time via enable_if

This commit is contained in:
Daniel J. Hofmann
2016-02-17 14:26:22 -08:00
committed by Patrick Niklaus
parent c75b497b2e
commit 3c58eaf49f
2 changed files with 46 additions and 37 deletions
+24 -17
View File
@@ -4,6 +4,10 @@
#include "engine/api/route_parameters.hpp"
#include "engine/api/table_parameters.hpp"
#include <boost/optional/optional.hpp>
#include <type_traits>
namespace osrm
{
namespace server
@@ -11,25 +15,28 @@ namespace server
namespace api
{
// Starts parsing and iter and modifies it until iter == end or parsing failed
template<typename ParameterT>
boost::optional<ParameterT> parseParameters(std::string::iterator& iter, std::string::iterator end);
// copy on purpose because we need mutability
template<typename ParameterT>
inline boost::optional<ParameterT> parseParameters(std::string options_string)
namespace detail
{
auto iter = options_string.begin();
return parseParameters<ParameterT>(iter, options_string.end());
template <typename T> using is_parameter_t = std::is_base_of<engine::api::BaseParameters, T>;
} // ns detail
// Starts parsing and iter and modifies it until iter == end or parsing failed
template <typename ParameterT,
typename std::enable_if<detail::is_parameter_t<ParameterT>::value, int>::type = 0>
boost::optional<ParameterT> parseParameters(std::string::iterator &iter, std::string::iterator end);
// Copy on purpose because we need mutability
template <typename ParameterT,
typename std::enable_if<detail::is_parameter_t<ParameterT>::value, int>::type = 0>
boost::optional<ParameterT> parseParameters(std::string options_string)
{
const auto first = options_string.begin();
const auto last = options_string.end();
return parseParameters<ParameterT>(first, last);
}
template<>
boost::optional<engine::api::RouteParameters> parseParameters(std::string::iterator& iter, std::string::iterator end);
template<>
boost::optional<engine::api::TableParameters> parseParameters(std::string::iterator& iter, std::string::iterator end);
}
}
}
} // ns api
} // ns server
} // ns osrm
#endif