Jump to content
  • Advertisement
Sign in to follow this  
X Abstract X

Help With Templates

This topic is 3028 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

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
Advertisement
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
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!