#include <type_traits>
#include <cstdint>
#include <string>

template <class T, class E = void>
struct Archiver {
    void archive(T obj);
};

template <class T>
struct Archiver<T, typename std::enable_if<std::is_class<T>::value && !std::is_pod<T>::value>::type>
{
    void archive(const T & obj);
};

template <> void Archiver<std::uint8_t>::archive(std::uint8_t obj);
template <> void Archiver<std::string>::archive(const std::string & obj);

int main() {}