Parece que você quer é:
void bar(vector<InterfaceA*> vecA, vector<InterfaceB*> vecB) {
// If InterfaceA == ImplA1 && InterfaceB == ImplB2 then:
foo<ImplA1, ImplB2> f(*dynamic_cast<const ImplA1*>(vecA.front()), *dynamic_cast<const ImplB2*>(vecB.front()));
// ...
f.feature1(); // if specialization not there, complain
}
o que não é possível, porque a instanciação do modelo é uma coisa em tempo de compilação e você quer tomar uma decisão sobre um tipo de tempo de execução dinâmico. (Btw. Mesmo acima só funciona se você der a InterfaceA|B
um ditor virtual.)
Então, do seu comentário // if spec not there, complain
, posso afirmar isso:
- Você não pode reclamar em tempo de compilação, porque a decisão de fazer é baseada em informações de tempo de execução
- Você poderia escrever um dispatcher de tempo de execução que seleciona a instanciação de modelo correta (ou falha com, por exemplo, uma exceção) em tempo de execução: Como fazer isso é outra história, possivelmente melhor respondida em SO .