Solved

c++ Nullable implementation

Posted on 2009-07-08
3
1,862 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
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

Enroll in June's Course of the Month

June’s Course of the Month is now available! Experts Exchange’s Premium Members, Team Accounts, and Qualified Experts have access to a complimentary course each month as part of their membership—an extra way to sharpen your skills and increase training.

Question has a verified solution.

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

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!
It was really hard time for me to get the understanding of Delegates in C#. I went through many websites and articles but I found them very clumsy. After going through those sites, I noted down the points in a easy way so here I am sharing that unde…
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use nested-loops 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.

726 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