Re: STL map containing pointer_to_binary_function
Barry,
Thanks for the help. I have been working on a different method to do
this, but have hit the same results.
I have created a base class:
template <typename T>
class base {
public:
base(T eval) :
mValue(eval)
{};
virtual ~base() {};
bool run(const string &actualValue) {
runInternal(mValue, actualValue);
}
protected:
virtual bool runInternal(int v1, const string &v2) = 0;
virtual bool runInternal(const string &v1, const string &v2) = 0;
protected:
T mValue;
};
template <typename T>
class d1 : public base<T> {
public:
d1(T eval) :
base<T>(eval)
{};
private:
bool runInternal(int v1, const string &v2) {
// convert string to int
return v1 == v2;
};
bool runInternal(const string &v1, const string &v2) {
return v1 == v2;
};
};
As I am sure you can see, I can not create a map<string, base *>
because base needs a type at that point. Can I somehow use a template
function in the class and not a complete template class?
Basically I need to have a map of functions, classes whatever that
test <, > and == of a known value and actual value. They can be
strings, int, and doubles. Is this possible?
Thanks
Glenn
On Aug 29, 10:28 am, Barry <dhb2...@gmail.com> wrote:
Glenn...@gmail.com wrote:
Thanks for the info.
Let me clearify my goal, I want a map to contain a string as the key
and a function pointer template as the data. Meaning, I want to insert
into the map the following things:
map["test"] = equal_to<string>; // or pointers to the
binary_function....
map["test1"] = equal_to<int>;
map["test2"] = less<double>;
etc...
I know the base template for all those functors is the binary_function
template.
Is it possible to have a map where the data is a binary_function
template?
use boost::any
#include <map>
#include <string>
#include <functional>
#include <algorithm>
#include <iostream>
#include <boost/any.hpp>
using namespace std;
using namespace boost;
struct FunctorDispatcher
{
void operator() (pair<string, boost::any> const& p) const {
if (p.first == "less<int>")
{
less<int> const* pFnct
= boost::any_cast<less<int> >(&(p.second));
if ((*pFnct)(1, 2))
cout << "true" << endl;
}
else if (p.first == "equal_to<string>")
{
equal_to<string> const* pFnct
= boost::any_cast<equal_to<std::string> >(&(p.second));
if ((*pFnct)("1", "1"))
cout << "true" << endl;
}
}
};
int main()
{
map<string, any> functorMap;
functorMap.insert(make_pair("less<int>", less<int>()));
functorMap.insert(make_pair("equal_to<string>", equal_to<string>()));
for_each(functorMap.begin(), functorMap.end(), FunctorDispatcher());
}
--
Thanks
Barry