Pointer to class data member “::*”

后端 未结 15 1655
清歌不尽
清歌不尽 2020-11-21 11:47

I came across this strange code snippet which compiles fine:

class Car
{
    public:
    int speed;
};

int main()
{
    int Car::*pSpeed = &Car::speed;
         


        
15条回答
  •  忘了有多久
    2020-11-21 12:23

    Suppose you have a structure. Inside of that structure are * some sort of name * two variables of the same type but with different meaning

    struct foo {
        std::string a;
        std::string b;
    };
    

    Okay, now let's say you have a bunch of foos in a container:

    // key: some sort of name, value: a foo instance
    std::map container;
    

    Okay, now suppose you load the data from separate sources, but the data is presented in the same fashion (eg, you need the same parsing method).

    You could do something like this:

    void readDataFromText(std::istream & input, std::map & container, std::string foo::*storage) {
        std::string line, name, value;
    
        // while lines are successfully retrieved
        while (std::getline(input, line)) {
            std::stringstream linestr(line);
            if ( line.empty() ) {
                continue;
            }
    
            // retrieve name and value
            linestr >> name >> value;
    
            // store value into correct storage, whichever one is correct
            container[name].*storage = value;
        }
    }
    
    std::map readValues() {
        std::map foos;
    
        std::ifstream a("input-a");
        readDataFromText(a, foos, &foo::a);
        std::ifstream b("input-b");
        readDataFromText(b, foos, &foo::b);
        return foos;
    }
    

    At this point, calling readValues() will return a container with a unison of "input-a" and "input-b"; all keys will be present, and foos with have either a or b or both.

提交回复
热议问题