C++ で仮想メンバ関数テンプレートを使いたい

class Base {
public:
  template <typename T> virtual void print(const T& v) {
    ...
  }
};

class Derived : public Base {
public:
  template <typename T> virtual void print(const T& v) {
    ...
  }
};

とか書きたい (けど動くわきゃない)。どうやれば書けるんだろうと思って、

#include <cassert>
#include <iostream>

class Base {
public:
  virtual ~Base() {}
  template <typename T> void print(const T& v);
};

class Derived : public Base {
public:
  template <typename T> void print(const T& v) {
    std::cout << v << std::endl;
  }
};

template <typename T>
void Base::print(const T& v)
{
  const std::type_info& true_type = typeid(*this);
  if (true_type == typeid(Derived)) {
    return static_cast<Derived*>(this)->print(v);
  }
  assert(0);
}

int main(void)
{
  Base* b = new Derived();
  b->print(3);
  b->print("hello");
  delete b;
  return 0;
}

と、してみたものの、いまいち。