условно возвращая тип объекта из функции

Есть ли способ вернуть тип из функции в C ++? Например, я хотел бы использовать что-то вроде:

// sample pseudo-code: NOT valid C++
template<typename Type1, typename Type2>
type??? getType(bool choice) {
if(choice == true) {
return Type1;
} else {
return Type2;
}
}

bool useAwesome = true;

// `Regular` and `Awesome` are classes
getType<Awesome, Regular>(useAwesome) theObject;

if заявление не будет работать, потому что:

if(useAwesome) {
Awesome theObject;
} else {
Regular theObject;
}
// theObject goes out of scope!

Я читал о «гражданине первого класса» и знаю, что тип данных не является, но будет использовать template помочь как-нибудь?

2

Решение

Нет, ты не можешь так делать. Тип в C ++ должен быть известен во время компиляции, а не во время выполнения. Вы можете вернуться typeid из функции, но вы не можете использовать это typeid объявить переменные соответствующего типа.

1

Другие решения

если ты необходимость чтобы выбрать тип во время выполнения, вы обычно используете наследование:

class Base {};

class Awesome : public Base;
class Regular : public Base;

Base *ObjectPointer;

if (useAwesome)
ObjectPointer = new Aweseome;
else
ObjectPointer = new Regular;

Base &theObject = *ObjectPointer;

Когда вы закончите с использованием theObject, обязательно delete ObjectPointer; (или же delete &theObject;).

Обратите внимание, что для того, чтобы добиться многого, вам обычно нужно определить общий интерфейс, чтобы использовать возможности Regular или же Awesome через их общий базовый класс. Обычно вы делаете это, объявляя (часто чистые) виртуальные функции в базовом классе, а затем реализуя эти функции в производных классах. По крайней мере, вам нужно объявить виртуальный деструктор в базовом классе (в противном случае, когда вы попытаетесь удалить объект через указатель на базу, вы получите неопределенное поведение).

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector