problem with bind2nd

B

Bruintje Beer

Hi,

I am having the following question (see code below)

the class Data is declared as
class Data
{
public :
// rest of class
};

class Base : public binary_function<string, Data, bool>
{
public :
virtual bool operator() (const string& line, Data d) const = 0;
};

class Derived_1 : public Base
{
bool operator()(const string& line, Data d)
{
// do your stuff
return true or false;
}
};

class Derived_2 : public Base
{
bool operator()(const string& line, Data d)
{
// do your stuff
return true or false;
}
};

in some other class which has a vector dataLines I want to perform a find
on the vector. My problem is that sometimes I need to call the operator()
on the derived_1 class and another time I need to call operator() on the
Derived_2 class. The find function has a pointer to Derived_1 or Derived_2
class. But what do I put as argument for the bind2nd class

bind2nd( // What do i put here // , data)

I tried bind2nd( c() , data) but is gives me the error below

error C2064: term does not evaluate to a function taking 0 arguments

void MyClass::find(Compare* c, Data data)
{
vector<string>::iteraor result;
result = find_if(dataLines.begin(), dataLines.end(), bind2nd( // What do
i put here // , data));

// rest of code

}

Does anyone know how to fix this

thanks a lot

John
 
B

Barry

Hi,

I am having the following question (see code below)

the class Data is declared as
class Data
{
public :
    // rest of class

};

class Base : public binary_function<string, Data, bool>
{
public :
    virtual bool operator() (const string& line, Data d) const = 0;

};

class Derived_1 : public Base
{
    bool operator()(const string& line, Data d)

const
    {
        // do your stuff
        return true or false;
    }

};

class Derived_2 : public Base
{
    bool operator()(const string& line, Data d)

const
    {
        // do your stuff
        return true or false;
    }

};

in some other class which has a vector dataLines I want to perform a find
on the vector. My problem is that sometimes I need to call the operator()
on the derived_1 class and another time I need to call operator() on the
Derived_2 class. The find function has a pointer to Derived_1 or Derived_2
class. But what do I put as argument for the bind2nd class

bind2nd( // What do i put here // , data)

I tried bind2nd( c() , data) but is gives me the error below

error C2064: term does not evaluate to a function taking 0 arguments

void MyClass::find(Compare* c, Data data)
{
    vector<string>::iteraor result;

iterator
    result = find_if(dataLines.begin(), dataLines.end(), bind2nd( // What do
i put here // , data));

    // rest of code

 }

Well, maybe std::bind2nd(Derived_1(), data);
Don't understand what's 'Compare' here. Wild guess: 'Base'

But keep in mind that STL functions *never* (AFAIK) take a functor by
reference (nor pointer),
so polymorphism is not satisfied.

If you mean 'Base' by 'Compare',
then bind2nd(*c, data) will cause a compile error,
saying 'Base' is an abstract class, can't be instantiated.
 
B

Bruintje Beer

Daniel T. said:
Frankly, it doesn't make a lot of sense to have an op() as pure virtual.
How are you supposed to call it? How would you call it if you were
writing the loop yourself?

class Data { };

class Derived_1 : public binary_function<string, Data, bool>
{
public:
bool operator()(const string& line, Data d) const
{
// do your stuff
return true or false;
}
};

class Derived_2 : public binary_function<string, Data, bool>
{
public:
bool operator()(const string& line, Data d) const
{
// do your stuff
return true or false;
}
};

class MyClass {
vector<string> dataLines;
public: // <-- whatever access restriction you want
template < typename Fn >
void find(Fn f, Data data)
{
vector<string>::iterator result =
find_if(dataLines.begin(), dataLines.end(), bind2nd(f, data));
}
};

int main()
{
MyClass c;
Data d;
c.find(Derived_1(), d);
c.find(Derived_2(), d);
}

Hi,

I do not understand right now but this is exactly what i needed. Thanks a
lot.

John
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,780
Messages
2,569,611
Members
45,280
Latest member
BGBBrock56

Latest Threads

Top