Sign in to follow this  
X Abstract X

Help With Templates

Recommended Posts

I've never really used templates and I'm trying to return a template from a function. I tried to write a function to cast an std::string to a generic value and surprisingly enough it compiles, until I try to use the function, then I get a linker error (wtf?). Here is what I have:
//EngineMath.cpp (added static to definition just for clarity)
template <class Type>
static Type EngineMath::stringToValue(const std::string& str) {
    std::stringstream stream;
    stream << str;

    Type result;

    if ((stream >> result).fail()) {
        //throw an exception
    }

    return(result);
}

//Main.cpp
std::string myString = "436.9728";
float x = EngineMath::stringToValue<float>(myString);

Share this post


Link to post
Share on other sites
Regarding the linker error, look here.

Also, I'm obliged to mention the existence of boost::lexical_cast(), which does what you're trying to do here, but is a little more sophisticated internally (and is also widely used and well tested).

Note however that I'm not suggesting you shouldn't implement this function yourself! This is a somewhat 'classic' example of a function template, and serves as a very good introduction to that topic. I just wanted to mention that boost::lexical_cast() does exist, and should probably be preferred over similar hand-rolled solutions for production code (in the general case, at least).

Share this post


Link to post
Share on other sites
Thanks. I am aware of boost::lexical cast however I didn't want to bother adding another dependency just for this.

Offtopic but somewhat related: for parsing numeric data stored in a file, what would you suggest as a solution? I've heard it plenty that std::stringstream and boost::lexical_cast are EXTREMELY, EXTREMELY slow.

Share this post


Link to post
Share on other sites
Quote:
Offtopic but somewhat related: for parsing numeric data stored in a file, what would you suggest as a solution? I've heard it plenty that std::stringstream and boost::lexical_cast are EXTREMELY, EXTREMELY slow.
I don't have any good suggestions off the top of my head :-| I'm certainly a proponent of using the SC++L and Boost wherever reasonable and appropriate, but I imagine there might be better (or at least more efficient) tools available for parsing large amounts of text. (I'm not sure how 'slow' std::stringstream is by itself, but I can certainly imagine that performing a large number of lexical_cast's could be somewhat costly. That's just guesswork though.)

I will mention one thing: if you're storing (or are open to storing) your data in XML format, there's at least one XML parsing library that parses the given text in situ for the sake of efficiency. *Googles...* Here it is. I imagine you could find something similar for JSON as well if you looked around a bit.

Anyway, maybe someone else can recommend a good (and fast) general purpose parser.

Share this post


Link to post
Share on other sites
Quote:

(I'm not sure how 'slow' std::stringstream is by itself, but I can certainly imagine that performing a large number of lexical_cast's could be somewhat costly.


I suppose one could add specializations to use faster conversion methods for built-in types? A look at boost's source shows that this is actually done there (uses streams with user-supplied buffer?).

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this