Можно ли обойти вызов конструктора по умолчанию для члена класса?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 01.10.18 17:33
Оценка:
Здравствуйте!

Можно ли обойти вызов конструктора по умолчанию для члена класса?

Идея такая:

const unsigned ok = 0;
const unsigned fail = 1;


class Error
{
public:

typedef unsigned error_code_type;

error_code_type error_code;

Error() : error_code(ok) {}
Error( const Error &e) : error_code(e.error_code) {}
explicit Error( error_code_type e ) : error_code(e) {}

// bool isSuccess();
// bool isFail();
//...
};


template <typename ResultType>
class Result : public Error
{
ResultType value;
Result( const ResultType &r ) : value(r) {}
Result(Error e) : Error(e) {} //!!!

// bool isSuccess();
// bool isFail();
//...
};

// Использование
Result<SomethingType> doSomething()
{
if (doSomethingAnother())
return SomethingType(/* with some args */);

return Error(fail);
}

int main()
{
auto res = doSomething();
if (res.isSuccess())
std::cout<<"Result: "<<res.value.asString()<<"\n";
else
std::cout<<"doSomething failed\n";

return 0;
}



Проблема возникает, когда SomethingType не имеет публичного конструктора по умолчанию — код просто не компилируется.

На ум приходит только зарезервировать место байтами, и когда нужно, вызывать inplace new.

Тут возникают другие проблемы — 1) уже просто так не обратится к члену класса; 2) проблема с выравниванием

Что тут можно сделать? Или может есть более интересное решение?
Маньяк Робокряк колесит по городу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.