Is storing any type of function in one variable possible?What are the differences between a pointer variable and a reference variable in C++?What's the difference between a method and a function?What is the naming convention in Python for variable and function names?var functionName = function() vs function functionName() What is the scope of variables in JavaScript?How do you check if a variable is an array in JavaScript?Set a default parameter value for a JavaScript functionHow to determine if variable is 'undefined' or 'null'?How to check if a variable is set in Bash?JavaScript check if variable exists (is defined/initialized)
Does an advisor owe his/her student anything? Will an advisor keep a PhD student only out of pity?
250 Floor Tower
The screen of my macbook suddenly broken down how can I do to recover
Where does the bonus feat in the cleric starting package come from?
The IT department bottlenecks progress. How should I handle this?
How do you respond to a colleague from another team when they're wrongly expecting that you'll help them?
Melting point of aspirin, contradicting sources
When were female captains banned from Starfleet?
Lowest total scrabble score
How should I respond when I lied about my education and the company finds out through background check?
The Staircase of Paint
Where did Heinlein say "Once you get to Earth orbit, you're halfway to anywhere in the Solar System"?
Is this toilet slogan correct usage of the English language?
Why did the HMS Bounty go back to a time when whales are already rare?
Fear of getting stuck on one programming language / technology that is not used in my country
Problem with TransformedDistribution
Redundant comparison & "if" before assignment
How much character growth crosses the line into breaking the character
Did arcade monitors have same pixel aspect ratio as TV sets?
What should you do if you miss a job interview (deliberately)?
How can Trident be so inexpensive? Will it orbit Triton or just do a (slow) flyby?
Loading commands from file
Approximating irrational number to rational number
Non-trope happy ending?
Is storing any type of function in one variable possible?
What are the differences between a pointer variable and a reference variable in C++?What's the difference between a method and a function?What is the naming convention in Python for variable and function names?var functionName = function() vs function functionName() What is the scope of variables in JavaScript?How do you check if a variable is an array in JavaScript?Set a default parameter value for a JavaScript functionHow to determine if variable is 'undefined' or 'null'?How to check if a variable is set in Bash?JavaScript check if variable exists (is defined/initialized)
I'm trying to make a menu array where each element is a struct that stores variables for text, key that needs to be pressed to select that item and function called on that key press (something like "Quit", 'Q', Quit()). I thought this would make things more efficient, but I can't find a way to make it work with varied function and parameter types (for example one item should be able to call a void function with no parameters, another a class int function with two parameters and so on). Is there a good way to do this or am I better off giving up on the idea?
Edit: Thank you all for your advice! The proposed solutions feel a little too complex for my newbie self, but attempting to understand them gave me some ideas! I ended up making the third variable hold an enum instead of a direct function call and then created a switch function that calls other functions based on that value.
c++ function variables
New contributor
add a comment |
I'm trying to make a menu array where each element is a struct that stores variables for text, key that needs to be pressed to select that item and function called on that key press (something like "Quit", 'Q', Quit()). I thought this would make things more efficient, but I can't find a way to make it work with varied function and parameter types (for example one item should be able to call a void function with no parameters, another a class int function with two parameters and so on). Is there a good way to do this or am I better off giving up on the idea?
Edit: Thank you all for your advice! The proposed solutions feel a little too complex for my newbie self, but attempting to understand them gave me some ideas! I ended up making the third variable hold an enum instead of a direct function call and then created a switch function that calls other functions based on that value.
c++ function variables
New contributor
2
You can use a lambda expression that calls your actual function
– Liran Funaro
Mar 19 at 9:55
1
Where do the class instance and the two parameters come from?
– Bergi
Mar 19 at 13:54
3
Look up the Command pattern. Note that I’m not saying not to use a function for this. But this pattern is the generalised form of what you need.
– Konrad Rudolph
Mar 19 at 14:32
Note that a interface with a single method is roughly equivalent to astd::function
type.
– Caleth
Mar 19 at 14:55
add a comment |
I'm trying to make a menu array where each element is a struct that stores variables for text, key that needs to be pressed to select that item and function called on that key press (something like "Quit", 'Q', Quit()). I thought this would make things more efficient, but I can't find a way to make it work with varied function and parameter types (for example one item should be able to call a void function with no parameters, another a class int function with two parameters and so on). Is there a good way to do this or am I better off giving up on the idea?
Edit: Thank you all for your advice! The proposed solutions feel a little too complex for my newbie self, but attempting to understand them gave me some ideas! I ended up making the third variable hold an enum instead of a direct function call and then created a switch function that calls other functions based on that value.
c++ function variables
New contributor
I'm trying to make a menu array where each element is a struct that stores variables for text, key that needs to be pressed to select that item and function called on that key press (something like "Quit", 'Q', Quit()). I thought this would make things more efficient, but I can't find a way to make it work with varied function and parameter types (for example one item should be able to call a void function with no parameters, another a class int function with two parameters and so on). Is there a good way to do this or am I better off giving up on the idea?
Edit: Thank you all for your advice! The proposed solutions feel a little too complex for my newbie self, but attempting to understand them gave me some ideas! I ended up making the third variable hold an enum instead of a direct function call and then created a switch function that calls other functions based on that value.
c++ function variables
c++ function variables
New contributor
New contributor
edited Mar 19 at 20:03
Rhyme
New contributor
asked Mar 19 at 9:51
RhymeRhyme
565
565
New contributor
New contributor
2
You can use a lambda expression that calls your actual function
– Liran Funaro
Mar 19 at 9:55
1
Where do the class instance and the two parameters come from?
– Bergi
Mar 19 at 13:54
3
Look up the Command pattern. Note that I’m not saying not to use a function for this. But this pattern is the generalised form of what you need.
– Konrad Rudolph
Mar 19 at 14:32
Note that a interface with a single method is roughly equivalent to astd::function
type.
– Caleth
Mar 19 at 14:55
add a comment |
2
You can use a lambda expression that calls your actual function
– Liran Funaro
Mar 19 at 9:55
1
Where do the class instance and the two parameters come from?
– Bergi
Mar 19 at 13:54
3
Look up the Command pattern. Note that I’m not saying not to use a function for this. But this pattern is the generalised form of what you need.
– Konrad Rudolph
Mar 19 at 14:32
Note that a interface with a single method is roughly equivalent to astd::function
type.
– Caleth
Mar 19 at 14:55
2
2
You can use a lambda expression that calls your actual function
– Liran Funaro
Mar 19 at 9:55
You can use a lambda expression that calls your actual function
– Liran Funaro
Mar 19 at 9:55
1
1
Where do the class instance and the two parameters come from?
– Bergi
Mar 19 at 13:54
Where do the class instance and the two parameters come from?
– Bergi
Mar 19 at 13:54
3
3
Look up the Command pattern. Note that I’m not saying not to use a function for this. But this pattern is the generalised form of what you need.
– Konrad Rudolph
Mar 19 at 14:32
Look up the Command pattern. Note that I’m not saying not to use a function for this. But this pattern is the generalised form of what you need.
– Konrad Rudolph
Mar 19 at 14:32
Note that a interface with a single method is roughly equivalent to a
std::function
type.– Caleth
Mar 19 at 14:55
Note that a interface with a single method is roughly equivalent to a
std::function
type.– Caleth
Mar 19 at 14:55
add a comment |
2 Answers
2
active
oldest
votes
There are actually a few ways of doing this.
One way is to use std::bind
to bind all functions to void func(void)
then you can store them equally.
The other way is to create a generic function/lambda which will call your function.
To store your functions you can use std::function
.
Also consider overriding operator()
of your classes.
add a comment |
The classic way of handling this is to have all the functions take the same parameters, and for those to be very flexible. For example, an integer or enum, and a pointer.
- your no-parameter function is passed -1 and
nullptr
and ignores them - your multi-parameter function casts the pointer to a pointer to some struct or class that holds all the bits and pieces it needs (and of course your calling code made that instance and passed its address)
The reason an enum or integer is hoisted out as one of the parameters is that "command type" is a super popular thing to need, so why do all that casting and extracting to get it?
If you have a performance problem as a result of this approach, then there are others, but this has literally been used for decades in Windows.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Rhyme is a new contributor. Be nice, and check out our Code of Conduct.
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%2f55238001%2fis-storing-any-type-of-function-in-one-variable-possible%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
There are actually a few ways of doing this.
One way is to use std::bind
to bind all functions to void func(void)
then you can store them equally.
The other way is to create a generic function/lambda which will call your function.
To store your functions you can use std::function
.
Also consider overriding operator()
of your classes.
add a comment |
There are actually a few ways of doing this.
One way is to use std::bind
to bind all functions to void func(void)
then you can store them equally.
The other way is to create a generic function/lambda which will call your function.
To store your functions you can use std::function
.
Also consider overriding operator()
of your classes.
add a comment |
There are actually a few ways of doing this.
One way is to use std::bind
to bind all functions to void func(void)
then you can store them equally.
The other way is to create a generic function/lambda which will call your function.
To store your functions you can use std::function
.
Also consider overriding operator()
of your classes.
There are actually a few ways of doing this.
One way is to use std::bind
to bind all functions to void func(void)
then you can store them equally.
The other way is to create a generic function/lambda which will call your function.
To store your functions you can use std::function
.
Also consider overriding operator()
of your classes.
answered Mar 19 at 9:58
Petar VelevPetar Velev
1,673719
1,673719
add a comment |
add a comment |
The classic way of handling this is to have all the functions take the same parameters, and for those to be very flexible. For example, an integer or enum, and a pointer.
- your no-parameter function is passed -1 and
nullptr
and ignores them - your multi-parameter function casts the pointer to a pointer to some struct or class that holds all the bits and pieces it needs (and of course your calling code made that instance and passed its address)
The reason an enum or integer is hoisted out as one of the parameters is that "command type" is a super popular thing to need, so why do all that casting and extracting to get it?
If you have a performance problem as a result of this approach, then there are others, but this has literally been used for decades in Windows.
add a comment |
The classic way of handling this is to have all the functions take the same parameters, and for those to be very flexible. For example, an integer or enum, and a pointer.
- your no-parameter function is passed -1 and
nullptr
and ignores them - your multi-parameter function casts the pointer to a pointer to some struct or class that holds all the bits and pieces it needs (and of course your calling code made that instance and passed its address)
The reason an enum or integer is hoisted out as one of the parameters is that "command type" is a super popular thing to need, so why do all that casting and extracting to get it?
If you have a performance problem as a result of this approach, then there are others, but this has literally been used for decades in Windows.
add a comment |
The classic way of handling this is to have all the functions take the same parameters, and for those to be very flexible. For example, an integer or enum, and a pointer.
- your no-parameter function is passed -1 and
nullptr
and ignores them - your multi-parameter function casts the pointer to a pointer to some struct or class that holds all the bits and pieces it needs (and of course your calling code made that instance and passed its address)
The reason an enum or integer is hoisted out as one of the parameters is that "command type" is a super popular thing to need, so why do all that casting and extracting to get it?
If you have a performance problem as a result of this approach, then there are others, but this has literally been used for decades in Windows.
The classic way of handling this is to have all the functions take the same parameters, and for those to be very flexible. For example, an integer or enum, and a pointer.
- your no-parameter function is passed -1 and
nullptr
and ignores them - your multi-parameter function casts the pointer to a pointer to some struct or class that holds all the bits and pieces it needs (and of course your calling code made that instance and passed its address)
The reason an enum or integer is hoisted out as one of the parameters is that "command type" is a super popular thing to need, so why do all that casting and extracting to get it?
If you have a performance problem as a result of this approach, then there are others, but this has literally been used for decades in Windows.
answered Mar 19 at 14:35
Kate GregoryKate Gregory
17.5k74881
17.5k74881
add a comment |
add a comment |
Rhyme is a new contributor. Be nice, and check out our Code of Conduct.
Rhyme is a new contributor. Be nice, and check out our Code of Conduct.
Rhyme is a new contributor. Be nice, and check out our Code of Conduct.
Rhyme is a new contributor. Be nice, and check out our Code of Conduct.
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
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%2f55238001%2fis-storing-any-type-of-function-in-one-variable-possible%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
2
You can use a lambda expression that calls your actual function
– Liran Funaro
Mar 19 at 9:55
1
Where do the class instance and the two parameters come from?
– Bergi
Mar 19 at 13:54
3
Look up the Command pattern. Note that I’m not saying not to use a function for this. But this pattern is the generalised form of what you need.
– Konrad Rudolph
Mar 19 at 14:32
Note that a interface with a single method is roughly equivalent to a
std::function
type.– Caleth
Mar 19 at 14:55