The possible options are described below:
1. sscanf()
    #include <cstdio>
    #include <string>
        int i;
        float f;
        double d;
        std::string str;
        // string -> integer
        if(sscanf(str.c_str(), "%d", &i) != 1)
            // error management
        // string -> float
        if(sscanf(str.c_str(), "%f", &f) != 1)
            // error management
    
        // string -> double 
        if(sscanf(str.c_str(), "%lf", &d) != 1)
            // error management
This is an error (also shown by cppcheck) because "scanf without field width limits can crash with huge input data on some versions of libc" (see here, and here).
2. std::sto()*
    #include <iostream>
    #include <string>
        int i;
        float f;
        double d;
        std::string str;
        try {
            // string -> integer
            int i = std::stoi(str);
            // string -> float
            float f = std::stof(str);
            // string -> double 
            double d = std::stod(str);
        } catch (...) {
            // error management
        }   
This solution is short and elegant, but it is available only on on C++11 compliant compilers.
3. sstreams
    #include <string>
    #include <sstream>
        int i;
        float f;
        double d;
        std::string str;
        // string -> integer
        std::istringstream ( str ) >> i;
        // string -> float
        std::istringstream ( str ) >> f;
        // string -> double 
        std::istringstream ( str ) >> d;
        // error management ??
However, with this solution is hard to distinguish between bad input (see here).
4. Boost's lexical_cast
    #include <boost/lexical_cast.hpp>
    #include <string>
        std::string str;
        try {
            int i = boost::lexical_cast<int>( str.c_str());
            float f = boost::lexical_cast<int>( str.c_str());
            double d = boost::lexical_cast<int>( str.c_str());
            } catch( boost::bad_lexical_cast const& ) {
                // Error management
        }
However, this is just a wrapper of sstream, and the documentation suggests to use sstream for better error management (see here).
5. strto()*
This solution is very long, due to error management, and it is described here. Since no function returns a plain int, a conversion is needed in case of integer (see here for how this conversion can be achieved).
6. Qt
    #include <QString>
    #include <string>
        bool ok;
        std::string;
        int i = QString::fromStdString(str).toInt(&ok);
        if (!ok)
            // Error management
    
        float f = QString::fromStdString(str).toFloat(&ok);
        if (!ok)
            // Error management 
        double d = QString::fromStdString(str).toDouble(&ok);
        if (!ok)
    // Error management     
    
Conclusions
Summing up, the best solution is C++11 std::stoi() or, as a second option, the use of Qt libraries. All other solutions are discouraged or buggy.