Solved

c++ Nullable implementation

Posted on 2009-07-08
3
1,700 Views
Last Modified: 2012-06-27
Do you know a good c++ implementation of the Nullable Generic in c#?
Something like Nullable<class T>

Is there a good way to avoid using the .Value member to get the value?
Nullable<float> Number;
 

float x=Number.Value; //Can I avoid the '.Value' here somehow? and use x=Number? without custom casting staff?

Open in new window

0
Comment
Question by:Hanochr
3 Comments
 
LVL 40

Accepted Solution

by:
evilrix earned 250 total points
ID: 24802668
Not being a C# expert and going just by the docs I think something like below (with a few tweaks maybe) will model the behavior you are after.

>> Is there a good way to avoid using the .Value member to get the value?
I've overloaded operator *()

template < typename T>

class Nullable

{

public:

   Nullable(T * p = 0)

      :p_(p)

   {

   }

 

   bool HadValue() const

   {

      return p_ != 0;

   }

 

   T const & Value() const

   {

      return *p_;

   }

 

   T & Value()

   {

      return *p_;

   }

 

   T const & operator * () const

   {

      return *p_;

   }

 

   T & operator * ()

   {

      return *p_;

   }

 

   T * p_;

 

private:

};

 

int main()

{

   bool b = true;

 

   Nullable<bool> bnYes(&b);

   Nullable<bool> bnNo;

}

Open in new window

0
 
LVL 53

Assisted Solution

by:Infinity08
Infinity08 earned 250 total points
ID: 24802720
I see evilrix already posted his suggestion. Mine's slightly different, so I'll post it too (it's a rough example, just to give an idea).


>> Is there a good way to avoid using the .Value member to get the value?

An overloaded cast operator like below should do the trick.
#include <iostream>
 

template <class T>

class Nullable {

  private :

    T data;

    bool null;
 

  public :

    Nullable(T d) : data(d), null(false) { }

    Nullable() : data(), null(true) { }
 

    bool hasValue() { return !null; }

    T value() { return data; }

    

    operator T() { return data; }

};
 

int main(void) {

  Nullable<float> numberA = Nullable<float>(5.0);

  Nullable<float> numberB = Nullable<float>();

  

  (numberA.hasValue()) ? (std::cout << numberA.value()) : (std::cout << "NULL"); std::cout << std::endl;

  (numberB.hasValue()) ? (std::cout << numberB.value()) : (std::cout << "NULL"); std::cout << std::endl;

  

  float value = numberA;

  std::cout << value << std::endl;

  

  return 0;

}

Open in new window

0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
COnsume rest client 6 34
How to learn Linux? 10 41
Syntax error 9 45
DateTimepicker 4 33
We all know that functional code is the leg that any good program stands on when it comes right down to it, however, if your program lacks a good user interface your product may not have the appeal needed to keep your customers happy. This issue can…
Entity Framework is a powerful tool to help you interact with the DataBase but still doesn't help much when we have a Stored Procedure that returns more than one resultset. The solution takes some of out-of-the-box thinking; read on!
The goal of this video is to provide viewers with basic examples to understand and use pointers in the C programming language.
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use while-loops in the C programming language.

929 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

15 Experts available now in Live!

Get 1:1 Help Now