How to store methods as function pointers in a map container?
up vote
13
down vote
favorite
I want to be able to call functions based on the data I read from file.
So for each item type, I want to call the desired reader method.
I wrote this code, but it does not compile where I want to add function pointers to the map. What is wrong?
#include <vector>
#include <map>
#include <iostream>
class reader
{
std::map< std::string, void(*)()> functionCallMap; // function pointer
void readA(){ std::cout << "reading An";};
void readB(){ std::cout << "reading Bn";};;
public:
reader()
{
*functionCallMap["A"] = &reader::readA;*
*functionCallMap["B"] = &reader::readB;*
}
void read()
{
auto (*f) = functionCallMap["A"];
(*f)();
}
};
I am filling the map at Constructor.
c++ function pointers
add a comment |
up vote
13
down vote
favorite
I want to be able to call functions based on the data I read from file.
So for each item type, I want to call the desired reader method.
I wrote this code, but it does not compile where I want to add function pointers to the map. What is wrong?
#include <vector>
#include <map>
#include <iostream>
class reader
{
std::map< std::string, void(*)()> functionCallMap; // function pointer
void readA(){ std::cout << "reading An";};
void readB(){ std::cout << "reading Bn";};;
public:
reader()
{
*functionCallMap["A"] = &reader::readA;*
*functionCallMap["B"] = &reader::readB;*
}
void read()
{
auto (*f) = functionCallMap["A"];
(*f)();
}
};
I am filling the map at Constructor.
c++ function pointers
5
A pointer to a non-member function is not the same as a pointer to a member function. The big difference is that member functions needs objects to be called on. You can solve it by usingstd::function
instead, together with either lambda expressions orstd::bind
.
– Some programmer dude
2 days ago
add a comment |
up vote
13
down vote
favorite
up vote
13
down vote
favorite
I want to be able to call functions based on the data I read from file.
So for each item type, I want to call the desired reader method.
I wrote this code, but it does not compile where I want to add function pointers to the map. What is wrong?
#include <vector>
#include <map>
#include <iostream>
class reader
{
std::map< std::string, void(*)()> functionCallMap; // function pointer
void readA(){ std::cout << "reading An";};
void readB(){ std::cout << "reading Bn";};;
public:
reader()
{
*functionCallMap["A"] = &reader::readA;*
*functionCallMap["B"] = &reader::readB;*
}
void read()
{
auto (*f) = functionCallMap["A"];
(*f)();
}
};
I am filling the map at Constructor.
c++ function pointers
I want to be able to call functions based on the data I read from file.
So for each item type, I want to call the desired reader method.
I wrote this code, but it does not compile where I want to add function pointers to the map. What is wrong?
#include <vector>
#include <map>
#include <iostream>
class reader
{
std::map< std::string, void(*)()> functionCallMap; // function pointer
void readA(){ std::cout << "reading An";};
void readB(){ std::cout << "reading Bn";};;
public:
reader()
{
*functionCallMap["A"] = &reader::readA;*
*functionCallMap["B"] = &reader::readB;*
}
void read()
{
auto (*f) = functionCallMap["A"];
(*f)();
}
};
I am filling the map at Constructor.
c++ function pointers
c++ function pointers
edited 2 days ago
jadarnel27
9,63362853
9,63362853
asked 2 days ago
Ring Zero
937
937
5
A pointer to a non-member function is not the same as a pointer to a member function. The big difference is that member functions needs objects to be called on. You can solve it by usingstd::function
instead, together with either lambda expressions orstd::bind
.
– Some programmer dude
2 days ago
add a comment |
5
A pointer to a non-member function is not the same as a pointer to a member function. The big difference is that member functions needs objects to be called on. You can solve it by usingstd::function
instead, together with either lambda expressions orstd::bind
.
– Some programmer dude
2 days ago
5
5
A pointer to a non-member function is not the same as a pointer to a member function. The big difference is that member functions needs objects to be called on. You can solve it by using
std::function
instead, together with either lambda expressions or std::bind
.– Some programmer dude
2 days ago
A pointer to a non-member function is not the same as a pointer to a member function. The big difference is that member functions needs objects to be called on. You can solve it by using
std::function
instead, together with either lambda expressions or std::bind
.– Some programmer dude
2 days ago
add a comment |
4 Answers
4
active
oldest
votes
up vote
19
down vote
accepted
You can use std::function
with a lambda or std::bind
:
class reader
{
std::map<std::string, std::function<void()>> functionCallMap;
void readA() { std::cout << "reading An"; };
void readB() { std::cout << "reading Bn"; };
public:
reader()
{
functionCallMap["A"] = [this]() { readA(); };
functionCallMap["B"] = std::bind(&reader::readB, this);
}
void read()
{
functionCallMap["A"]();
functionCallMap["B"]();
}
};
I prefer your solution because it's more C++ish and cleaner than raw function pointer. Anyway lamba should be preferred to std::bind (Scott Meyer's Effective Modern C++)
– Moia
2 days ago
Yes, It is a nice solution. But, according to Jason Turner, bind is expensive both in compile time and memory usage.
– Ring Zero
2 days ago
@RingZero You should still use std::function instead of a function pointer, I would strongly advise switching the marked answer to this one for future readers. Using actual function pointers is bad for a number of reasons, but one issue is that you can't bind to anything that is a lambda pointer with variable capture. You will notice that std::function doesn't need the class pointer in the signature using the above.
– opa
2 days ago
add a comment |
up vote
15
down vote
You need to use pointers to member functions, like this:
class reader
{
using FuncPtr = void(reader::*)(); // function pointer
std::map< std::string, FuncPtr> functionCallMap;
void readA(){ std::cout << "reading An"; }
void readB(){ std::cout << "reading Bn"; }
public:
reader()
{
functionCallMap["A"] = &reader::readA;
functionCallMap["B"] = &reader::readB;
}
void read()
{
auto f = functionCallMap["A"];
(this->*f)();
}
};
int main()
{
reader r;
r.read();
}
New contributor
Tried it and it works quite fine. Thanks.
– Ring Zero
2 days ago
add a comment |
up vote
8
down vote
There are two answers so far, this and this.
The obvious difference is that one uses std::function
and other uses function pointers. This is not the important difference!!
The key point is that the member functions are non-static member functions. So, they are not of type void()
.
They are of type void(reader::*)()
. Thus, they can be only called if an object of type is reader is given; one can understand this somewhat as a hidden parameter.
The first answer just fixes the problem by specifying the correct type. This can be done using function pointers (as presented) or using std::function
(The latter is much more expensive!).
The second answer fixes the problem by binding the function pointer to the particular instance of the class. After binding, the type is then indeed void()
. This cannot be done using raw function pointers (because they can only point to a function and not an object/function pair!).
Also note that the timing of the binding is a design choice. I.E. does the application always want to bind the object storing the function pointers or potentially another one?
– Keith
2 days ago
add a comment |
up vote
0
down vote
I ended up with this solution. It does the job, but I have some doubts over its aesthetics. Anyway, to sum up, I ended up with this code:
#include <map>
#include <iostream>
#include <functional>
class reader
{
std::map< std::string, std::function<void(std::string tableName)>> functionCallMap; // function pointer
void readA(const std::string tableName){ std::cout << "reading:" << tableName<< "n"; }
void readB(const std::string tableName){ std::cout << "reading:" << tableName <<"n"; }
public:
reader()
{
functionCallMap["A"] = std::bind(&reader::readA, this, std::placeholders::_1);
functionCallMap["B"] = std::bind(&reader::readA, this, std::placeholders::_1);
}
void read()
{
const std::string table_name = "A";
functionCallMap[table_name](table_name);
}
};
int main()
{
reader r;
r.read();
}
I pass the table name to the reader, it is nicely done with the bind and placeholder.
You should use string references in your callback functions instead of a copy. And as Moia said, you really should use a lambda instead ofstd::bind
. About the aesthetics, I don't understand why you need a map of function sincereadA
andreadB
are the same. MoreoverreadB
is never used so why don't just put so code ofreadA
intoread
?
– Siliace
13 hours ago
@Siliace, It seems lambda and bind has its own pros and cons, read A and read B are going to read different kinds of tables, different formats and invoke different factory methods down the line.
– Ring Zero
12 hours ago
add a comment |
4 Answers
4
active
oldest
votes
4 Answers
4
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
19
down vote
accepted
You can use std::function
with a lambda or std::bind
:
class reader
{
std::map<std::string, std::function<void()>> functionCallMap;
void readA() { std::cout << "reading An"; };
void readB() { std::cout << "reading Bn"; };
public:
reader()
{
functionCallMap["A"] = [this]() { readA(); };
functionCallMap["B"] = std::bind(&reader::readB, this);
}
void read()
{
functionCallMap["A"]();
functionCallMap["B"]();
}
};
I prefer your solution because it's more C++ish and cleaner than raw function pointer. Anyway lamba should be preferred to std::bind (Scott Meyer's Effective Modern C++)
– Moia
2 days ago
Yes, It is a nice solution. But, according to Jason Turner, bind is expensive both in compile time and memory usage.
– Ring Zero
2 days ago
@RingZero You should still use std::function instead of a function pointer, I would strongly advise switching the marked answer to this one for future readers. Using actual function pointers is bad for a number of reasons, but one issue is that you can't bind to anything that is a lambda pointer with variable capture. You will notice that std::function doesn't need the class pointer in the signature using the above.
– opa
2 days ago
add a comment |
up vote
19
down vote
accepted
You can use std::function
with a lambda or std::bind
:
class reader
{
std::map<std::string, std::function<void()>> functionCallMap;
void readA() { std::cout << "reading An"; };
void readB() { std::cout << "reading Bn"; };
public:
reader()
{
functionCallMap["A"] = [this]() { readA(); };
functionCallMap["B"] = std::bind(&reader::readB, this);
}
void read()
{
functionCallMap["A"]();
functionCallMap["B"]();
}
};
I prefer your solution because it's more C++ish and cleaner than raw function pointer. Anyway lamba should be preferred to std::bind (Scott Meyer's Effective Modern C++)
– Moia
2 days ago
Yes, It is a nice solution. But, according to Jason Turner, bind is expensive both in compile time and memory usage.
– Ring Zero
2 days ago
@RingZero You should still use std::function instead of a function pointer, I would strongly advise switching the marked answer to this one for future readers. Using actual function pointers is bad for a number of reasons, but one issue is that you can't bind to anything that is a lambda pointer with variable capture. You will notice that std::function doesn't need the class pointer in the signature using the above.
– opa
2 days ago
add a comment |
up vote
19
down vote
accepted
up vote
19
down vote
accepted
You can use std::function
with a lambda or std::bind
:
class reader
{
std::map<std::string, std::function<void()>> functionCallMap;
void readA() { std::cout << "reading An"; };
void readB() { std::cout << "reading Bn"; };
public:
reader()
{
functionCallMap["A"] = [this]() { readA(); };
functionCallMap["B"] = std::bind(&reader::readB, this);
}
void read()
{
functionCallMap["A"]();
functionCallMap["B"]();
}
};
You can use std::function
with a lambda or std::bind
:
class reader
{
std::map<std::string, std::function<void()>> functionCallMap;
void readA() { std::cout << "reading An"; };
void readB() { std::cout << "reading Bn"; };
public:
reader()
{
functionCallMap["A"] = [this]() { readA(); };
functionCallMap["B"] = std::bind(&reader::readB, this);
}
void read()
{
functionCallMap["A"]();
functionCallMap["B"]();
}
};
answered 2 days ago
Siliace
38615
38615
I prefer your solution because it's more C++ish and cleaner than raw function pointer. Anyway lamba should be preferred to std::bind (Scott Meyer's Effective Modern C++)
– Moia
2 days ago
Yes, It is a nice solution. But, according to Jason Turner, bind is expensive both in compile time and memory usage.
– Ring Zero
2 days ago
@RingZero You should still use std::function instead of a function pointer, I would strongly advise switching the marked answer to this one for future readers. Using actual function pointers is bad for a number of reasons, but one issue is that you can't bind to anything that is a lambda pointer with variable capture. You will notice that std::function doesn't need the class pointer in the signature using the above.
– opa
2 days ago
add a comment |
I prefer your solution because it's more C++ish and cleaner than raw function pointer. Anyway lamba should be preferred to std::bind (Scott Meyer's Effective Modern C++)
– Moia
2 days ago
Yes, It is a nice solution. But, according to Jason Turner, bind is expensive both in compile time and memory usage.
– Ring Zero
2 days ago
@RingZero You should still use std::function instead of a function pointer, I would strongly advise switching the marked answer to this one for future readers. Using actual function pointers is bad for a number of reasons, but one issue is that you can't bind to anything that is a lambda pointer with variable capture. You will notice that std::function doesn't need the class pointer in the signature using the above.
– opa
2 days ago
I prefer your solution because it's more C++ish and cleaner than raw function pointer. Anyway lamba should be preferred to std::bind (Scott Meyer's Effective Modern C++)
– Moia
2 days ago
I prefer your solution because it's more C++ish and cleaner than raw function pointer. Anyway lamba should be preferred to std::bind (Scott Meyer's Effective Modern C++)
– Moia
2 days ago
Yes, It is a nice solution. But, according to Jason Turner, bind is expensive both in compile time and memory usage.
– Ring Zero
2 days ago
Yes, It is a nice solution. But, according to Jason Turner, bind is expensive both in compile time and memory usage.
– Ring Zero
2 days ago
@RingZero You should still use std::function instead of a function pointer, I would strongly advise switching the marked answer to this one for future readers. Using actual function pointers is bad for a number of reasons, but one issue is that you can't bind to anything that is a lambda pointer with variable capture. You will notice that std::function doesn't need the class pointer in the signature using the above.
– opa
2 days ago
@RingZero You should still use std::function instead of a function pointer, I would strongly advise switching the marked answer to this one for future readers. Using actual function pointers is bad for a number of reasons, but one issue is that you can't bind to anything that is a lambda pointer with variable capture. You will notice that std::function doesn't need the class pointer in the signature using the above.
– opa
2 days ago
add a comment |
up vote
15
down vote
You need to use pointers to member functions, like this:
class reader
{
using FuncPtr = void(reader::*)(); // function pointer
std::map< std::string, FuncPtr> functionCallMap;
void readA(){ std::cout << "reading An"; }
void readB(){ std::cout << "reading Bn"; }
public:
reader()
{
functionCallMap["A"] = &reader::readA;
functionCallMap["B"] = &reader::readB;
}
void read()
{
auto f = functionCallMap["A"];
(this->*f)();
}
};
int main()
{
reader r;
r.read();
}
New contributor
Tried it and it works quite fine. Thanks.
– Ring Zero
2 days ago
add a comment |
up vote
15
down vote
You need to use pointers to member functions, like this:
class reader
{
using FuncPtr = void(reader::*)(); // function pointer
std::map< std::string, FuncPtr> functionCallMap;
void readA(){ std::cout << "reading An"; }
void readB(){ std::cout << "reading Bn"; }
public:
reader()
{
functionCallMap["A"] = &reader::readA;
functionCallMap["B"] = &reader::readB;
}
void read()
{
auto f = functionCallMap["A"];
(this->*f)();
}
};
int main()
{
reader r;
r.read();
}
New contributor
Tried it and it works quite fine. Thanks.
– Ring Zero
2 days ago
add a comment |
up vote
15
down vote
up vote
15
down vote
You need to use pointers to member functions, like this:
class reader
{
using FuncPtr = void(reader::*)(); // function pointer
std::map< std::string, FuncPtr> functionCallMap;
void readA(){ std::cout << "reading An"; }
void readB(){ std::cout << "reading Bn"; }
public:
reader()
{
functionCallMap["A"] = &reader::readA;
functionCallMap["B"] = &reader::readB;
}
void read()
{
auto f = functionCallMap["A"];
(this->*f)();
}
};
int main()
{
reader r;
r.read();
}
New contributor
You need to use pointers to member functions, like this:
class reader
{
using FuncPtr = void(reader::*)(); // function pointer
std::map< std::string, FuncPtr> functionCallMap;
void readA(){ std::cout << "reading An"; }
void readB(){ std::cout << "reading Bn"; }
public:
reader()
{
functionCallMap["A"] = &reader::readA;
functionCallMap["B"] = &reader::readB;
}
void read()
{
auto f = functionCallMap["A"];
(this->*f)();
}
};
int main()
{
reader r;
r.read();
}
New contributor
edited 2 days ago
New contributor
answered 2 days ago
snake_style
47036
47036
New contributor
New contributor
Tried it and it works quite fine. Thanks.
– Ring Zero
2 days ago
add a comment |
Tried it and it works quite fine. Thanks.
– Ring Zero
2 days ago
Tried it and it works quite fine. Thanks.
– Ring Zero
2 days ago
Tried it and it works quite fine. Thanks.
– Ring Zero
2 days ago
add a comment |
up vote
8
down vote
There are two answers so far, this and this.
The obvious difference is that one uses std::function
and other uses function pointers. This is not the important difference!!
The key point is that the member functions are non-static member functions. So, they are not of type void()
.
They are of type void(reader::*)()
. Thus, they can be only called if an object of type is reader is given; one can understand this somewhat as a hidden parameter.
The first answer just fixes the problem by specifying the correct type. This can be done using function pointers (as presented) or using std::function
(The latter is much more expensive!).
The second answer fixes the problem by binding the function pointer to the particular instance of the class. After binding, the type is then indeed void()
. This cannot be done using raw function pointers (because they can only point to a function and not an object/function pair!).
Also note that the timing of the binding is a design choice. I.E. does the application always want to bind the object storing the function pointers or potentially another one?
– Keith
2 days ago
add a comment |
up vote
8
down vote
There are two answers so far, this and this.
The obvious difference is that one uses std::function
and other uses function pointers. This is not the important difference!!
The key point is that the member functions are non-static member functions. So, they are not of type void()
.
They are of type void(reader::*)()
. Thus, they can be only called if an object of type is reader is given; one can understand this somewhat as a hidden parameter.
The first answer just fixes the problem by specifying the correct type. This can be done using function pointers (as presented) or using std::function
(The latter is much more expensive!).
The second answer fixes the problem by binding the function pointer to the particular instance of the class. After binding, the type is then indeed void()
. This cannot be done using raw function pointers (because they can only point to a function and not an object/function pair!).
Also note that the timing of the binding is a design choice. I.E. does the application always want to bind the object storing the function pointers or potentially another one?
– Keith
2 days ago
add a comment |
up vote
8
down vote
up vote
8
down vote
There are two answers so far, this and this.
The obvious difference is that one uses std::function
and other uses function pointers. This is not the important difference!!
The key point is that the member functions are non-static member functions. So, they are not of type void()
.
They are of type void(reader::*)()
. Thus, they can be only called if an object of type is reader is given; one can understand this somewhat as a hidden parameter.
The first answer just fixes the problem by specifying the correct type. This can be done using function pointers (as presented) or using std::function
(The latter is much more expensive!).
The second answer fixes the problem by binding the function pointer to the particular instance of the class. After binding, the type is then indeed void()
. This cannot be done using raw function pointers (because they can only point to a function and not an object/function pair!).
There are two answers so far, this and this.
The obvious difference is that one uses std::function
and other uses function pointers. This is not the important difference!!
The key point is that the member functions are non-static member functions. So, they are not of type void()
.
They are of type void(reader::*)()
. Thus, they can be only called if an object of type is reader is given; one can understand this somewhat as a hidden parameter.
The first answer just fixes the problem by specifying the correct type. This can be done using function pointers (as presented) or using std::function
(The latter is much more expensive!).
The second answer fixes the problem by binding the function pointer to the particular instance of the class. After binding, the type is then indeed void()
. This cannot be done using raw function pointers (because they can only point to a function and not an object/function pair!).
edited 2 days ago
pushkin
3,673102450
3,673102450
answered 2 days ago
Handy999
812
812
Also note that the timing of the binding is a design choice. I.E. does the application always want to bind the object storing the function pointers or potentially another one?
– Keith
2 days ago
add a comment |
Also note that the timing of the binding is a design choice. I.E. does the application always want to bind the object storing the function pointers or potentially another one?
– Keith
2 days ago
Also note that the timing of the binding is a design choice. I.E. does the application always want to bind the object storing the function pointers or potentially another one?
– Keith
2 days ago
Also note that the timing of the binding is a design choice. I.E. does the application always want to bind the object storing the function pointers or potentially another one?
– Keith
2 days ago
add a comment |
up vote
0
down vote
I ended up with this solution. It does the job, but I have some doubts over its aesthetics. Anyway, to sum up, I ended up with this code:
#include <map>
#include <iostream>
#include <functional>
class reader
{
std::map< std::string, std::function<void(std::string tableName)>> functionCallMap; // function pointer
void readA(const std::string tableName){ std::cout << "reading:" << tableName<< "n"; }
void readB(const std::string tableName){ std::cout << "reading:" << tableName <<"n"; }
public:
reader()
{
functionCallMap["A"] = std::bind(&reader::readA, this, std::placeholders::_1);
functionCallMap["B"] = std::bind(&reader::readA, this, std::placeholders::_1);
}
void read()
{
const std::string table_name = "A";
functionCallMap[table_name](table_name);
}
};
int main()
{
reader r;
r.read();
}
I pass the table name to the reader, it is nicely done with the bind and placeholder.
You should use string references in your callback functions instead of a copy. And as Moia said, you really should use a lambda instead ofstd::bind
. About the aesthetics, I don't understand why you need a map of function sincereadA
andreadB
are the same. MoreoverreadB
is never used so why don't just put so code ofreadA
intoread
?
– Siliace
13 hours ago
@Siliace, It seems lambda and bind has its own pros and cons, read A and read B are going to read different kinds of tables, different formats and invoke different factory methods down the line.
– Ring Zero
12 hours ago
add a comment |
up vote
0
down vote
I ended up with this solution. It does the job, but I have some doubts over its aesthetics. Anyway, to sum up, I ended up with this code:
#include <map>
#include <iostream>
#include <functional>
class reader
{
std::map< std::string, std::function<void(std::string tableName)>> functionCallMap; // function pointer
void readA(const std::string tableName){ std::cout << "reading:" << tableName<< "n"; }
void readB(const std::string tableName){ std::cout << "reading:" << tableName <<"n"; }
public:
reader()
{
functionCallMap["A"] = std::bind(&reader::readA, this, std::placeholders::_1);
functionCallMap["B"] = std::bind(&reader::readA, this, std::placeholders::_1);
}
void read()
{
const std::string table_name = "A";
functionCallMap[table_name](table_name);
}
};
int main()
{
reader r;
r.read();
}
I pass the table name to the reader, it is nicely done with the bind and placeholder.
You should use string references in your callback functions instead of a copy. And as Moia said, you really should use a lambda instead ofstd::bind
. About the aesthetics, I don't understand why you need a map of function sincereadA
andreadB
are the same. MoreoverreadB
is never used so why don't just put so code ofreadA
intoread
?
– Siliace
13 hours ago
@Siliace, It seems lambda and bind has its own pros and cons, read A and read B are going to read different kinds of tables, different formats and invoke different factory methods down the line.
– Ring Zero
12 hours ago
add a comment |
up vote
0
down vote
up vote
0
down vote
I ended up with this solution. It does the job, but I have some doubts over its aesthetics. Anyway, to sum up, I ended up with this code:
#include <map>
#include <iostream>
#include <functional>
class reader
{
std::map< std::string, std::function<void(std::string tableName)>> functionCallMap; // function pointer
void readA(const std::string tableName){ std::cout << "reading:" << tableName<< "n"; }
void readB(const std::string tableName){ std::cout << "reading:" << tableName <<"n"; }
public:
reader()
{
functionCallMap["A"] = std::bind(&reader::readA, this, std::placeholders::_1);
functionCallMap["B"] = std::bind(&reader::readA, this, std::placeholders::_1);
}
void read()
{
const std::string table_name = "A";
functionCallMap[table_name](table_name);
}
};
int main()
{
reader r;
r.read();
}
I pass the table name to the reader, it is nicely done with the bind and placeholder.
I ended up with this solution. It does the job, but I have some doubts over its aesthetics. Anyway, to sum up, I ended up with this code:
#include <map>
#include <iostream>
#include <functional>
class reader
{
std::map< std::string, std::function<void(std::string tableName)>> functionCallMap; // function pointer
void readA(const std::string tableName){ std::cout << "reading:" << tableName<< "n"; }
void readB(const std::string tableName){ std::cout << "reading:" << tableName <<"n"; }
public:
reader()
{
functionCallMap["A"] = std::bind(&reader::readA, this, std::placeholders::_1);
functionCallMap["B"] = std::bind(&reader::readA, this, std::placeholders::_1);
}
void read()
{
const std::string table_name = "A";
functionCallMap[table_name](table_name);
}
};
int main()
{
reader r;
r.read();
}
I pass the table name to the reader, it is nicely done with the bind and placeholder.
answered yesterday
Ring Zero
937
937
You should use string references in your callback functions instead of a copy. And as Moia said, you really should use a lambda instead ofstd::bind
. About the aesthetics, I don't understand why you need a map of function sincereadA
andreadB
are the same. MoreoverreadB
is never used so why don't just put so code ofreadA
intoread
?
– Siliace
13 hours ago
@Siliace, It seems lambda and bind has its own pros and cons, read A and read B are going to read different kinds of tables, different formats and invoke different factory methods down the line.
– Ring Zero
12 hours ago
add a comment |
You should use string references in your callback functions instead of a copy. And as Moia said, you really should use a lambda instead ofstd::bind
. About the aesthetics, I don't understand why you need a map of function sincereadA
andreadB
are the same. MoreoverreadB
is never used so why don't just put so code ofreadA
intoread
?
– Siliace
13 hours ago
@Siliace, It seems lambda and bind has its own pros and cons, read A and read B are going to read different kinds of tables, different formats and invoke different factory methods down the line.
– Ring Zero
12 hours ago
You should use string references in your callback functions instead of a copy. And as Moia said, you really should use a lambda instead of
std::bind
. About the aesthetics, I don't understand why you need a map of function since readA
and readB
are the same. Moreover readB
is never used so why don't just put so code of readA
into read
?– Siliace
13 hours ago
You should use string references in your callback functions instead of a copy. And as Moia said, you really should use a lambda instead of
std::bind
. About the aesthetics, I don't understand why you need a map of function since readA
and readB
are the same. Moreover readB
is never used so why don't just put so code of readA
into read
?– Siliace
13 hours ago
@Siliace, It seems lambda and bind has its own pros and cons, read A and read B are going to read different kinds of tables, different formats and invoke different factory methods down the line.
– Ring Zero
12 hours ago
@Siliace, It seems lambda and bind has its own pros and cons, read A and read B are going to read different kinds of tables, different formats and invoke different factory methods down the line.
– Ring Zero
12 hours ago
add a comment |
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53336880%2fhow-to-store-methods-as-function-pointers-in-a-map-container%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
5
A pointer to a non-member function is not the same as a pointer to a member function. The big difference is that member functions needs objects to be called on. You can solve it by using
std::function
instead, together with either lambda expressions orstd::bind
.– Some programmer dude
2 days ago