Добрый день всем...
просьба не пинать сильно — только учусь...
вот решил попробовать написать простенький класс и ничего толком не получается.
идея такая — мне нужен простой тип с его поведением плюс еще одно свойство...
первое что пришло в голову — наследование (точнее это было второе, но с первым я совсем запутался...)
template <typename T>
class nullable: public T
{
public:
nullable(): is_null_(true) {};
nullable(const T &other): is_null_(false), T(other) {};
bool & is_null() const
{
return is_null_;
};
bool operator == (const T &other) const
{
if (this.is_null || other.is_null)
throw null_value_compare("null_value_compare");
// 1. проверка типов
// 2. что возвращать?
};
private:
bool is_null_;
};
int main()
{
nullable<std::string> str = "std::string";
std::cout << str.c_str() << std::endl;
}
отступление: за все лишние '&' и 'const' давайте сразу по рукам — еще не чувствую...
1. проверка типов я так понимаю это compile-time, но как здесь избежать авто-преобразования?
2. как вызвать оператор сравнения базового класса? явным преобразованием? static_cast?
больше всего пугает здесь наследование от простого типа, так что этот вариант наверное отпадает...
теперь первое, что пришло в голову — имплементация, но с ней еще хуже.
не могу понять, как добиться поведения, такого же как простой тип?
конечно, можно завести ф-цию, которая будет возвращать ссылку на T, но хотелось бы более дружественного поведения.
можно перегрузить оператор '()', но тогда прийдется делать преобразования (т.е. выглядеть будет так: std::string(str).c_str())...