#pragma once namespace vlc { struct VLC_LIBRARY_API Library { using LibraryHandle = void*; LibraryHandle _handle = nullptr; Library() = default; ~Library(); Library(const Library&) = delete; Library& operator = (const Library&) = delete; Library(Library&& src) { std::swap(_handle, src._handle); } Library& operator = (Library&& src) { std::swap(_handle, src._handle); return *this; } explicit operator bool() const { return _handle != nullptr; } bool load(const char* name, bool auto_ext = true); void* symbol(const char* name); template F get(const char* name) { return reinterpret_cast(symbol(name)); } }; }