Boost logo

Boost :

From: Michael D. Borghardt (michael_at_[hidden])
Date: 2004-02-12 03:56:17


This started with looking at sign/unsigned interfaces and how to handle
range problems. Now this looks to me to handle any numeric conversion
problems.

Comments, and criticisms welcome.

#include <boost/numeric/cast.hpp>
template<typename Target>
class numeric_class
{
public:
    template<typename Source>numeric_class(numeric_class<Source> &s)
    {
        value_ = boost::numeric_cast<Target>(s);
    }

    template<typename Source>numeric_class(Source s)
    {
        value_ = boost::numeric_cast<Target>(s);
    }

    numeric_class(Target s)
    {
        value_ = s;
    }

    template <typename Resultant> operator Resultant()
    {
        return boost::numeric_cast<Resultant>(value_);
    }

    operator Target()
    {
        return value;
    }

private:
    Target value_;
};

void Bar(numeric_class<unsigned long> ul)
{
    // we know that value in ul is in range if we get here
}

numeric_class<float> Foo(numeric_class<unsigned long> ul)
{
    // we know that value in ul is in range if we get here
    return numeric_class<float>(ul);
}

int main ()
{
    try
    {
        float f = 5.5;

        numeric_class<unsigned long> ul(f);

        char c1 = ul;

        // function interface converts float to unsigned long AND checks to
make sure it is in range
        Bar(f);

        // function interface converts char to unsigned long AND checks to
make sure it is in range
        // return float that is in range
        f = Foo(c1);
        // if we get here we have a valid f
    }
    catch(std::exception const &ex)
    {
        std::cerr << "EXCEPTION: " << ex.what() << "\n";
    }
    return 0;
}


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk