Типы статические, определенные при компиляции кода, поэтому у вас не может быть другого типа возврата в зависимости от значения времени выполнения. Функция может возвращать только один тип.
Один из вариантов - использовать дискриминационный союз; объединение различных типов, которые вы хотите поддержать, вместе с перечисляемым значением, чтобы указать, какой тип активен. Это довольно сложно реализовать, если вы хотите поддерживать общие типы классов, поэтому вам может понадобиться посмотреть библиотеку Boost Variant. Например:
boost::variant<int,T> function(int i) {
if (i>0)
return A{1};
else
return int{5};
}
int main() {
A res1 = boost::get<A>(function(5));
int res2 = boost::get<int>(funtion(-5);
}
Другим вариантом может быть, чтобы обеспечить набор функций обратного вызова для различных типов и обрабатывать значение там, а не возвращать его. Например:
template <typename Callback>
void function(int i, Callback & callback)
if (i>0)
callback(A{1});
else
callback(int{5});
}
struct MyCallback {
void operator()(A const &) {/* do something with A */}
void operator()(int) {/* do something with int */}
};
int main() {
MyCallback callback;
function(5, callback); // calls callback for A
function(-5, callback); // calls callback for int
}
Используйте тип 'union'. – Barmar
Почему вы думаете, что хотите этого? – OmnipotentEntity
Являются ли параметры аргументов постоянной времени компиляции? –