How to use a function of own class in for_each method?

前端 未结 3 1049
太阳男子
太阳男子 2021-01-07 05:21

Assume I have this class (inherited from std::Vector, it\'s just an example)

#include 

using namespace std;

template 
class C          


        
相关标签:
3条回答
  • 2021-01-07 05:58

    You need to bind the this pointer:

    public:   
    void method() 
    {
        for_each(this->begin(), this->end(), bind(&C::transformation, this, placeholders::_1));
    }
    
    0 讨论(0)
  • 2021-01-07 06:15

    For starters, don't inherit from the standard containers, they are not designed to be inherited (no virtual destructors etc.).

    Secondly, and regarding your problem, it's because a pointer to a member function is not the same as a pointer to a function. The reason is that member function has a hidden first parameter which becomes the this pointer in the function. The simplest way to solve it is to make the function static.

    Another solution is to use the std::bind function that came with C++11:

    for_each(this->begin(), this->end(),
        std::bind(&C::transformation, this, std::placeholders::_1));
    

    If you don't have C++11 (even though you tagged your question as such), then you probably could get something working with std::mem_fun or std::bind1st.

    0 讨论(0)
  • 2021-01-07 06:18

    C++11 bind solution:

    std::for_each(this->begin(), this->end(),
          std::bind(&C::transformation, this, std::placeholders::_1));
    

    C++11 lambda solution:

    std::for_each(this->begin(), this->end(),
          [this] (T& i) { transformation(i); });
    

    C++14 generic lambda solution:

    std::for_each(this->begin(), this->end(),
          [this] (auto&& i) { transformation(std::forward<decltype(i)>(i)); });
    

    C++98 bind1st+mem_fun solution:

    std::for_each(this->begin(), this->end(),
          std::bind1st(std::mem_fun(&C::transformation), this));
    

    Note: this->begin() and this->end() calls are qualified with this-> only because in the OP's code they are member functions of a templated base class. As such, those names are primirarily searched in a global namespace. Any other occurrence of this is mandatory.

    0 讨论(0)
提交回复
热议问题