Is it possible to use function return type as an argument in declaration of another function in C++?

Multi tool use
Multi tool use

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP











up vote
23
down vote

favorite












I want something like this:



std::tuple<int, bool, double> MyFunction_1 (void);

void MyFunction_2 (decltype (MyFunction_1) &params);


Obviously, in this example a code pointer to function would be passed.



I want to have the equivalent of this:



void MyFunction_2 (std::tuple<int, bool, double> &params);


Is it possible to do so?










share|improve this question



















  • 1




    About wording, I think you are asking if it is possible to use MyFunction_1 return type as an argument for MyFunction_2
    – Loreto
    1 hour ago










  • Yup. Thanks for correction
    – Dmitrii Motorygin
    19 mins ago














up vote
23
down vote

favorite












I want something like this:



std::tuple<int, bool, double> MyFunction_1 (void);

void MyFunction_2 (decltype (MyFunction_1) &params);


Obviously, in this example a code pointer to function would be passed.



I want to have the equivalent of this:



void MyFunction_2 (std::tuple<int, bool, double> &params);


Is it possible to do so?










share|improve this question



















  • 1




    About wording, I think you are asking if it is possible to use MyFunction_1 return type as an argument for MyFunction_2
    – Loreto
    1 hour ago










  • Yup. Thanks for correction
    – Dmitrii Motorygin
    19 mins ago












up vote
23
down vote

favorite









up vote
23
down vote

favorite











I want something like this:



std::tuple<int, bool, double> MyFunction_1 (void);

void MyFunction_2 (decltype (MyFunction_1) &params);


Obviously, in this example a code pointer to function would be passed.



I want to have the equivalent of this:



void MyFunction_2 (std::tuple<int, bool, double> &params);


Is it possible to do so?










share|improve this question















I want something like this:



std::tuple<int, bool, double> MyFunction_1 (void);

void MyFunction_2 (decltype (MyFunction_1) &params);


Obviously, in this example a code pointer to function would be passed.



I want to have the equivalent of this:



void MyFunction_2 (std::tuple<int, bool, double> &params);


Is it possible to do so?







c++ c++11 decltype






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 18 mins ago

























asked 12 hours ago









Dmitrii Motorygin

1357




1357







  • 1




    About wording, I think you are asking if it is possible to use MyFunction_1 return type as an argument for MyFunction_2
    – Loreto
    1 hour ago










  • Yup. Thanks for correction
    – Dmitrii Motorygin
    19 mins ago












  • 1




    About wording, I think you are asking if it is possible to use MyFunction_1 return type as an argument for MyFunction_2
    – Loreto
    1 hour ago










  • Yup. Thanks for correction
    – Dmitrii Motorygin
    19 mins ago







1




1




About wording, I think you are asking if it is possible to use MyFunction_1 return type as an argument for MyFunction_2
– Loreto
1 hour ago




About wording, I think you are asking if it is possible to use MyFunction_1 return type as an argument for MyFunction_2
– Loreto
1 hour ago












Yup. Thanks for correction
– Dmitrii Motorygin
19 mins ago




Yup. Thanks for correction
– Dmitrii Motorygin
19 mins ago












2 Answers
2






active

oldest

votes

















up vote
29
down vote













decltype (MyFunction_1) will give you the type of MyFunction_1 (i.e. the function type std::tuple<int, bool, double> ()), you need to emulate a function calling 1 (via adding ()) to get the return type (i.e. std::tuple<int, bool, double>), e.g.



void MyFunction_2 (decltype (MyFunction_1()) &params);
// ^^



1 The expression is evaluated at compile-time, the function won't be called at run-time actually.






share|improve this answer


















  • 2




    Because....? FGITWing is nice and all, but an answer should explain to the OP and future readers why adding two characters solves the problem here.
    – StoryTeller
    12 hours ago






  • 2




    Would "you need to emulate a function call in the decltype()" be a better wording? :P
    – Rerito
    11 hours ago






  • 9




    Another approach (maybe more straightforward): std::result_of
    – Ptaq666
    11 hours ago






  • 5




    @Ptaq666 That's an answer and should be posted as one.
    – pipe
    8 hours ago

















up vote
15
down vote













The type of MyFunction_1 is not std::tuple<int, bool, double> - informally you can think of it as a function pointer. In fact &MyFunction_1 decays to itself and is certainly a pointer.



So decltype(MyFunction_1) is not what you want.



The solution is to write decltype(MyFunction_1()). The type of MyFunction_1() is std::tuple<int, bool, double>. Note that this doesn't actually call the function; it's rather like sizeof in that respect.






share|improve this answer
















  • 1




    MyFunction_1 decays to a pointer, &MyFunction_1 does not -- it is one already :)
    – Quentin
    7 hours ago










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',
convertImagesToLinks: true,
noModals: false,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);













 

draft saved


draft discarded


















StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f52811378%2fis-it-possible-to-use-function-return-type-as-an-argument-in-declaration-of-anot%23new-answer', 'question_page');

);

Post as a guest






























2 Answers
2






active

oldest

votes








2 Answers
2






active

oldest

votes









active

oldest

votes






active

oldest

votes








up vote
29
down vote













decltype (MyFunction_1) will give you the type of MyFunction_1 (i.e. the function type std::tuple<int, bool, double> ()), you need to emulate a function calling 1 (via adding ()) to get the return type (i.e. std::tuple<int, bool, double>), e.g.



void MyFunction_2 (decltype (MyFunction_1()) &params);
// ^^



1 The expression is evaluated at compile-time, the function won't be called at run-time actually.






share|improve this answer


















  • 2




    Because....? FGITWing is nice and all, but an answer should explain to the OP and future readers why adding two characters solves the problem here.
    – StoryTeller
    12 hours ago






  • 2




    Would "you need to emulate a function call in the decltype()" be a better wording? :P
    – Rerito
    11 hours ago






  • 9




    Another approach (maybe more straightforward): std::result_of
    – Ptaq666
    11 hours ago






  • 5




    @Ptaq666 That's an answer and should be posted as one.
    – pipe
    8 hours ago














up vote
29
down vote













decltype (MyFunction_1) will give you the type of MyFunction_1 (i.e. the function type std::tuple<int, bool, double> ()), you need to emulate a function calling 1 (via adding ()) to get the return type (i.e. std::tuple<int, bool, double>), e.g.



void MyFunction_2 (decltype (MyFunction_1()) &params);
// ^^



1 The expression is evaluated at compile-time, the function won't be called at run-time actually.






share|improve this answer


















  • 2




    Because....? FGITWing is nice and all, but an answer should explain to the OP and future readers why adding two characters solves the problem here.
    – StoryTeller
    12 hours ago






  • 2




    Would "you need to emulate a function call in the decltype()" be a better wording? :P
    – Rerito
    11 hours ago






  • 9




    Another approach (maybe more straightforward): std::result_of
    – Ptaq666
    11 hours ago






  • 5




    @Ptaq666 That's an answer and should be posted as one.
    – pipe
    8 hours ago












up vote
29
down vote










up vote
29
down vote









decltype (MyFunction_1) will give you the type of MyFunction_1 (i.e. the function type std::tuple<int, bool, double> ()), you need to emulate a function calling 1 (via adding ()) to get the return type (i.e. std::tuple<int, bool, double>), e.g.



void MyFunction_2 (decltype (MyFunction_1()) &params);
// ^^



1 The expression is evaluated at compile-time, the function won't be called at run-time actually.






share|improve this answer














decltype (MyFunction_1) will give you the type of MyFunction_1 (i.e. the function type std::tuple<int, bool, double> ()), you need to emulate a function calling 1 (via adding ()) to get the return type (i.e. std::tuple<int, bool, double>), e.g.



void MyFunction_2 (decltype (MyFunction_1()) &params);
// ^^



1 The expression is evaluated at compile-time, the function won't be called at run-time actually.







share|improve this answer














share|improve this answer



share|improve this answer








edited 11 hours ago

























answered 12 hours ago









songyuanyao

86k9166226




86k9166226







  • 2




    Because....? FGITWing is nice and all, but an answer should explain to the OP and future readers why adding two characters solves the problem here.
    – StoryTeller
    12 hours ago






  • 2




    Would "you need to emulate a function call in the decltype()" be a better wording? :P
    – Rerito
    11 hours ago






  • 9




    Another approach (maybe more straightforward): std::result_of
    – Ptaq666
    11 hours ago






  • 5




    @Ptaq666 That's an answer and should be posted as one.
    – pipe
    8 hours ago












  • 2




    Because....? FGITWing is nice and all, but an answer should explain to the OP and future readers why adding two characters solves the problem here.
    – StoryTeller
    12 hours ago






  • 2




    Would "you need to emulate a function call in the decltype()" be a better wording? :P
    – Rerito
    11 hours ago






  • 9




    Another approach (maybe more straightforward): std::result_of
    – Ptaq666
    11 hours ago






  • 5




    @Ptaq666 That's an answer and should be posted as one.
    – pipe
    8 hours ago







2




2




Because....? FGITWing is nice and all, but an answer should explain to the OP and future readers why adding two characters solves the problem here.
– StoryTeller
12 hours ago




Because....? FGITWing is nice and all, but an answer should explain to the OP and future readers why adding two characters solves the problem here.
– StoryTeller
12 hours ago




2




2




Would "you need to emulate a function call in the decltype()" be a better wording? :P
– Rerito
11 hours ago




Would "you need to emulate a function call in the decltype()" be a better wording? :P
– Rerito
11 hours ago




9




9




Another approach (maybe more straightforward): std::result_of
– Ptaq666
11 hours ago




Another approach (maybe more straightforward): std::result_of
– Ptaq666
11 hours ago




5




5




@Ptaq666 That's an answer and should be posted as one.
– pipe
8 hours ago




@Ptaq666 That's an answer and should be posted as one.
– pipe
8 hours ago












up vote
15
down vote













The type of MyFunction_1 is not std::tuple<int, bool, double> - informally you can think of it as a function pointer. In fact &MyFunction_1 decays to itself and is certainly a pointer.



So decltype(MyFunction_1) is not what you want.



The solution is to write decltype(MyFunction_1()). The type of MyFunction_1() is std::tuple<int, bool, double>. Note that this doesn't actually call the function; it's rather like sizeof in that respect.






share|improve this answer
















  • 1




    MyFunction_1 decays to a pointer, &MyFunction_1 does not -- it is one already :)
    – Quentin
    7 hours ago














up vote
15
down vote













The type of MyFunction_1 is not std::tuple<int, bool, double> - informally you can think of it as a function pointer. In fact &MyFunction_1 decays to itself and is certainly a pointer.



So decltype(MyFunction_1) is not what you want.



The solution is to write decltype(MyFunction_1()). The type of MyFunction_1() is std::tuple<int, bool, double>. Note that this doesn't actually call the function; it's rather like sizeof in that respect.






share|improve this answer
















  • 1




    MyFunction_1 decays to a pointer, &MyFunction_1 does not -- it is one already :)
    – Quentin
    7 hours ago












up vote
15
down vote










up vote
15
down vote









The type of MyFunction_1 is not std::tuple<int, bool, double> - informally you can think of it as a function pointer. In fact &MyFunction_1 decays to itself and is certainly a pointer.



So decltype(MyFunction_1) is not what you want.



The solution is to write decltype(MyFunction_1()). The type of MyFunction_1() is std::tuple<int, bool, double>. Note that this doesn't actually call the function; it's rather like sizeof in that respect.






share|improve this answer












The type of MyFunction_1 is not std::tuple<int, bool, double> - informally you can think of it as a function pointer. In fact &MyFunction_1 decays to itself and is certainly a pointer.



So decltype(MyFunction_1) is not what you want.



The solution is to write decltype(MyFunction_1()). The type of MyFunction_1() is std::tuple<int, bool, double>. Note that this doesn't actually call the function; it's rather like sizeof in that respect.







share|improve this answer












share|improve this answer



share|improve this answer










answered 11 hours ago









Bathsheba

170k26239362




170k26239362







  • 1




    MyFunction_1 decays to a pointer, &MyFunction_1 does not -- it is one already :)
    – Quentin
    7 hours ago












  • 1




    MyFunction_1 decays to a pointer, &MyFunction_1 does not -- it is one already :)
    – Quentin
    7 hours ago







1




1




MyFunction_1 decays to a pointer, &MyFunction_1 does not -- it is one already :)
– Quentin
7 hours ago




MyFunction_1 decays to a pointer, &MyFunction_1 does not -- it is one already :)
– Quentin
7 hours ago

















 

draft saved


draft discarded















































 


draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f52811378%2fis-it-possible-to-use-function-return-type-as-an-argument-in-declaration-of-anot%23new-answer', 'question_page');

);

Post as a guest













































































9lf5IxZytQbAtFAk5Iy oRQJ62ZVglF9 qZxnu DtW,uwIAt EVH5hjm0caPBW1uISj,B Sl6NH1krnBw,qSFoV4CN WFBivS88,IH6C
BBmHvCQvidV9jE2awKFgL3vnqvGQnQ5,I1mu

Popular posts from this blog

How to check contact read email or not when send email to Individual?

How many registers does an x86_64 CPU actually have?

Displaying single band from multi-band raster using QGIS