Вы не можете. Идеальная пересылка работает только путем объединения шаблонов и rvalue-ссылок, потому что это зависит от того, какой тип реального типа T&&
оценивается, когда T специализирован. Вы не можете смешивать шаблоны и виртуальные функции.
Однако вы можете решить проблему с помощью какого-либо механизма стирания типов:
struct base {
virtual void invoke() = 0;
};
template <class T>
struct derived : public base {
derived( T&& yourval ) : m_value(std::forward(yourval)) {}
virtual void invoke() { /* operate on m_value.. */ }
T&& m_value;
};