Listing 3

// SharedLibrary.h

#include <string>

class SharedLibraryException
{
  public:
    SharedLibraryException(const char* error) : m_error(error) { }
    const char* getError() const {return m_error.c_str();}
  private:
    std::string m_error;
};
class SharedLibrary
{
  public:
    static SharedLibrary* openSharedLibrary(const char* name)
        throw (SharedLibraryException);
    virtual ~SharedLibrary() {}
    virtual void* findSymbol(const char* name) = 0;

  // ...
};

template<class T>
T findSymbol(SharedLibrary& sl, const char* name)
{
    return (T)sl.findSymbol(name);
}