Solved

c++ Nullable implementation

Posted on 2009-07-08
3
1,662 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
Comment Utility
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
Comment Utility
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

Enabling OSINT in Activity Based Intelligence

Activity based intelligence (ABI) requires access to all available sources of data. Recorded Future allows analysts to observe structured data on the open, deep, and dark web.

Join & Write a Comment

Summary: This tutorial covers some basics of pointer, pointer arithmetic and function pointer. What is a pointer: A pointer is a variable which holds an address. This address might be address of another variable/address of devices/address of fu…
Real-time is more about the business, not the technology. In day-to-day life, to make real-time decisions like buying or investing, business needs the latest information(e.g. Gold Rate/Stock Rate). Unlike traditional days, you need not wait for a fe…
The goal of this video is to provide viewers with basic examples to understand and use structures in the C programming language.
The goal of this video is to provide viewers with basic examples to understand opening and writing to files in the C programming language.

762 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

7 Experts available now in Live!

Get 1:1 Help Now