Есть ли способ вернуть тип из функции в 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
помочь как-нибудь?
Нет, ты не можешь так делать. Тип в C ++ должен быть известен во время компиляции, а не во время выполнения. Вы можете вернуться typeid
из функции, но вы не можете использовать это typeid
объявить переменные соответствующего типа.
если ты необходимость чтобы выбрать тип во время выполнения, вы обычно используете наследование:
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
через их общий базовый класс. Обычно вы делаете это, объявляя (часто чистые) виртуальные функции в базовом классе, а затем реализуя эти функции в производных классах. По крайней мере, вам нужно объявить виртуальный деструктор в базовом классе (в противном случае, когда вы попытаетесь удалить объект через указатель на базу, вы получите неопределенное поведение).