void erase(T value);
template<typename U> static BitSet<T> from_bitmask(U mask);
- typename std::underlying_type<T>::type to_bitmask() const;
+ typename std::underlying_type_t<T> to_bitmask() const;
private:
- typename std::underlying_type<T>::type m_value;
+ typename std::underlying_type_t<T> m_value;
};
// --- Inline implementations ---
template<typename T>
inline BitSet<T>::BitSet(T value)
- : m_value(static_cast<typename std::underlying_type<T>::type>(value))
+ : m_value(static_cast<typename std::underlying_type_t<T>>(value))
{
}
inline bool
BitSet<T>::contains(T value) const
{
- return m_value & static_cast<typename std::underlying_type<T>::type>(value);
+ return m_value & static_cast<typename std::underlying_type_t<T>>(value);
}
template<typename T>
inline void
BitSet<T>::insert(T value)
{
- m_value |= static_cast<typename std::underlying_type<T>::type>(value);
+ m_value |= static_cast<typename std::underlying_type_t<T>>(value);
}
template<typename T>
inline void
BitSet<T>::insert(const BitSet& set)
{
- m_value |= static_cast<typename std::underlying_type<T>::type>(set.m_value);
+ m_value |= static_cast<typename std::underlying_type_t<T>>(set.m_value);
}
template<typename T>
inline void
BitSet<T>::erase(T value)
{
- m_value &= ~static_cast<typename std::underlying_type<T>::type>(value);
+ m_value &= ~static_cast<typename std::underlying_type_t<T>>(value);
}
template<typename T>
}
template<typename T>
-inline typename std::underlying_type<T>::type
+inline typename std::underlying_type_t<T>
BitSet<T>::to_bitmask() const
{
return m_value;
// used to retrieve the result once the task completes.
template<typename F, typename... Args>
auto enqueue(F&& f, Args&&... args)
- -> std::future<typename std::invoke_result<F, Args...>::type>;
+ -> std::future<typename std::invoke_result_t<F, Args...>>;
void shut_down() noexcept;
template<typename F, typename... Args>
auto
ThreadPool::enqueue(F&& f, Args&&... args)
- -> std::future<typename std::invoke_result<F, Args...>::type>
+ -> std::future<typename std::invoke_result_t<F, Args...>>
{
- using return_type = typename std::invoke_result<F, Args...>::type;
+ using return_type = typename std::invoke_result_t<F, Args...>;
auto task = std::make_shared<std::packaged_task<return_type()>>(
std::bind(std::forward<F>(f), std::forward<Args>(args)...));