C/C++

C++, Как сделать тип возврата из функции по ситуации / динамический? P.S.auto не поможет

Есть класс в котором три указателя на разные типы, и есть одна функция self() которая должна вернуть один из этих указателей вот что я должен указать в типе возврата у self().

class Object
{
int* ptr1;
char* ptr2;
double* ptr3

???self()
{
return ptr1 или ptr2 или ptr3 по ситуации;
}
}
Islambek Ali
Islambek Ali
453
// Предлагаю шаблон!

#include <iostream>
using namespace std;
template<typename Type>
class Pointer {
public:
Pointer() : pointer(new Type) {}
Pointer(const Pointer& o) : pointer(new Type) {
*pointer = *o.pointer;
}
Pointer(Pointer&& o) : pointer(new Type) {
pointer = forward<Type*>(o.pointer);
o.pointer = nullptr;
}
Pointer& operator=(const Pointer& o) {
if (&o != this) *pointer = *o.pointer;
return *this;
}
Pointer& operator=(Pointer&& o) {
pointer = forward<Type*>(o.pointer);
o.pointer = nullptr;
return *this;
}
~Pointer() {
if (pointer != nullptr) {
delete pointer;
pointer = nullptr;
}
}
void value(const Type& value) {
*pointer = value;
}
Type value()const {
return *pointer;
}
Type* self()const {
return pointer;
}
private:
Type* pointer;
};
int main() {
Pointer<char> char_pointer;
char_pointer.value('w');
auto char_self = char_pointer.self();
Pointer<int> int_pointer;
int_pointer.value(25);
auto int_self = int_pointer.self();
Pointer<double> double_pointer;
double_pointer.value(12.5);
auto double_self = double_pointer.self();
system("pause > nul");
}
Максим Яковлев
Максим Яковлев
77 609
Лучший ответ
Ну, можно возвращать void*, а потом кастить к нужному типу.

P.s А может имеет смысл сделать класс шаблонным?
P.P.s Если скажешь, что ты вообще пытаешься сделать, то мы, возможно, сможем дать более конкретный ответ.
Levon Mkhitaryan
Levon Mkhitaryan
17 671
#include< variant >

class Object
{
variant< int*, char*, double* >storage;
public:
template< typename T >
T self()
{
return get< T >(storage);
}
};
Только это бесполезно, их всё равно надо как-то инициализировать
Levon Mkhitaryan А разве функции могут отличаться только типом возвращаемого значения?
Нет в плюсах такого дерьма
Можно сделать union, но нет никакого способа узнать, какой тип в него положили.

Если это адекватная необходимость, пилите класс-обёртку.