У вас проблема со строгой типизацией во время компиляции, и вы хотите изменить тип во время выполнения. Когда шаблон для функции скомпилирован, он должен знать, какие типы предусмотреть. Вы можете использовать разные типы, вы просто не можете сделать все это в одну строку.
Неужели делать convert () так дорого, что вы захотите делать это только в случае необходимости в Function?
Отойдя от шаблона ...
Ваше описание сделало длину метода хуже, чем может показаться, вам нужно, чтобы ваши a's b и c уже были определены. Вы также можете сократить условия до оператора switch.
Если вы сохранили a, b и c как законченные объекты и могли бы попросить его передать значение функции.
class a {
p1, p2;
condition;
val value() { return condition? p1.convert, p2.convert };
}
Вы можете сделать так, чтобы они имели интерфейс, общий для тех методов, которые необходимы в функции. Есть несколько способов сделать это, но проще всего, если вы можете изменить класс для TypeA1 и т. Д. Добавление родительского класса чего-то вроде IConvertable здесь.
class IConvertable{
public:
~IConvertable(){}
virtual val convert() = 0;
}
И затем реализация преобразования в каждом классе для вызова статической версии преобразования.