Code:
#include <type_traits>
#include <iostream>
#include <vector>
struct IWriter {};
template<typename T> struct foo {};
template<typename T> class foo2 {};
struct BaseBar {};
struct DerivedBar: BaseBar {};
template <typename T> void SerializeFieldGeneric(IWriter& writer, const T& val);
template <typename T> void SerializeFieldDispatcher(IWriter& writer, const T& val, std::true_type);
template <typename T> void SerializeFieldDispatcher(IWriter& writer, const T& val, std::false_type);
template <typename T> void SerializeField(IWriter& writer, const T& val);
template<template<typename> class Container, typename V> void SerializeField(IWriter& writer, const Container<V>& col);
void SerializeFieldDerived(IWriter& writer, const BaseBar& val);
template <typename T>
void SerializeFieldGeneric(IWriter&, const T&) { std::cout << "SerializeFieldGeneric<T>\n"; }
template <typename T>
void SerializeFieldDispatcher(IWriter& writer, const T& val, std::true_type) { SerializeFieldDerived(writer, val); } // Is derived type
template <typename T>
void SerializeFieldDispatcher(IWriter& writer, const T& val, std::false_type) { SerializeFieldGeneric(writer, val); } // Is not derived type
template <typename T>
void SerializeField(IWriter& writer, const T& val) { SerializeFieldDispatcher(writer, val, std::is_base_of<BaseBar, T>()); }
template<template<typename> class Container, typename V>
void SerializeField(IWriter&, const Container<V>&) { std::cout << "SerializeField<Container<V>>\n"; }
void SerializeFieldDerived(IWriter&, const BaseBar&) { std::cout << "SerializeField<BaseBar>\n"; }
int main()
{
int t1;
foo<int> t2;
std::vector<int> t3;
foo2<int> t4;
IWriter writer;
BaseBar Base;
DerivedBar Derived;
SerializeField(writer, t1);
SerializeField(writer, t2);
SerializeField(writer, t3);
SerializeField(writer, t4);
SerializeField(writer, Base);
SerializeField(writer, Derived);
}
Output:
SerializeFieldGeneric<T>
SerializeField<Container<V>>
SerializeFieldGeneric<T>
SerializeField<Container<V>>
SerializeField<BaseBar>
SerializeField<BaseBar>
Anyway, I have a working solution now via the explicit overloads for vector and list, and the magickery of std::is_base_of.
Thanks a bunch to both of you!