Set callback function using unique_ptr of another class
I am in need to implement a callback method using a unique_ptr of another class:
#include <iostream>
#include <functional>
#include <memory>
class A
{
public:
void Show(void) {}
};
class B
{
public:
void SetCB(std::function<void(void)> callb);
private:
std::function<void(void)> cb;
};
void B::SetCB(std::function<void(void)> callb)
{
cb= callb;
}
int main()
{
std::unique_ptr<A> a1 = std::make_unique<A>();
std::unique_ptr<B> b1 = std::make_unique<B>();
b1->SetCB(&a1->Show, a1.get());
}
I am getting compilation error:
$ c++ -std=c++14 try68.cpp
try68.cpp: In function 'int main()':
try68.cpp:28:29: error: no matching function for call to 'B::SetCB(<unresolved overloaded function type>, std::unique_ptr<A>::pointer)'
b1->SetCB(a1->Show, a1.get());
^
try68.cpp:28:29: note: candidate is:
try68.cpp:19:6: note: void B::SetCB(std::function<void()>)
void B::SetCB(std::function<void(void)> callb)
^
try68.cpp:19:6: note: candidate expects 1 argument, 2 provided
^
Is it not possible to set a callback methods using unique_ptr?
c++ c++11
add a comment |
I am in need to implement a callback method using a unique_ptr of another class:
#include <iostream>
#include <functional>
#include <memory>
class A
{
public:
void Show(void) {}
};
class B
{
public:
void SetCB(std::function<void(void)> callb);
private:
std::function<void(void)> cb;
};
void B::SetCB(std::function<void(void)> callb)
{
cb= callb;
}
int main()
{
std::unique_ptr<A> a1 = std::make_unique<A>();
std::unique_ptr<B> b1 = std::make_unique<B>();
b1->SetCB(&a1->Show, a1.get());
}
I am getting compilation error:
$ c++ -std=c++14 try68.cpp
try68.cpp: In function 'int main()':
try68.cpp:28:29: error: no matching function for call to 'B::SetCB(<unresolved overloaded function type>, std::unique_ptr<A>::pointer)'
b1->SetCB(a1->Show, a1.get());
^
try68.cpp:28:29: note: candidate is:
try68.cpp:19:6: note: void B::SetCB(std::function<void()>)
void B::SetCB(std::function<void(void)> callb)
^
try68.cpp:19:6: note: candidate expects 1 argument, 2 provided
^
Is it not possible to set a callback methods using unique_ptr?
c++ c++11
add a comment |
I am in need to implement a callback method using a unique_ptr of another class:
#include <iostream>
#include <functional>
#include <memory>
class A
{
public:
void Show(void) {}
};
class B
{
public:
void SetCB(std::function<void(void)> callb);
private:
std::function<void(void)> cb;
};
void B::SetCB(std::function<void(void)> callb)
{
cb= callb;
}
int main()
{
std::unique_ptr<A> a1 = std::make_unique<A>();
std::unique_ptr<B> b1 = std::make_unique<B>();
b1->SetCB(&a1->Show, a1.get());
}
I am getting compilation error:
$ c++ -std=c++14 try68.cpp
try68.cpp: In function 'int main()':
try68.cpp:28:29: error: no matching function for call to 'B::SetCB(<unresolved overloaded function type>, std::unique_ptr<A>::pointer)'
b1->SetCB(a1->Show, a1.get());
^
try68.cpp:28:29: note: candidate is:
try68.cpp:19:6: note: void B::SetCB(std::function<void()>)
void B::SetCB(std::function<void(void)> callb)
^
try68.cpp:19:6: note: candidate expects 1 argument, 2 provided
^
Is it not possible to set a callback methods using unique_ptr?
c++ c++11
I am in need to implement a callback method using a unique_ptr of another class:
#include <iostream>
#include <functional>
#include <memory>
class A
{
public:
void Show(void) {}
};
class B
{
public:
void SetCB(std::function<void(void)> callb);
private:
std::function<void(void)> cb;
};
void B::SetCB(std::function<void(void)> callb)
{
cb= callb;
}
int main()
{
std::unique_ptr<A> a1 = std::make_unique<A>();
std::unique_ptr<B> b1 = std::make_unique<B>();
b1->SetCB(&a1->Show, a1.get());
}
I am getting compilation error:
$ c++ -std=c++14 try68.cpp
try68.cpp: In function 'int main()':
try68.cpp:28:29: error: no matching function for call to 'B::SetCB(<unresolved overloaded function type>, std::unique_ptr<A>::pointer)'
b1->SetCB(a1->Show, a1.get());
^
try68.cpp:28:29: note: candidate is:
try68.cpp:19:6: note: void B::SetCB(std::function<void()>)
void B::SetCB(std::function<void(void)> callb)
^
try68.cpp:19:6: note: candidate expects 1 argument, 2 provided
^
Is it not possible to set a callback methods using unique_ptr?
c++ c++11
c++ c++11
edited Nov 25 '18 at 15:16
Programmer
asked Nov 25 '18 at 15:13
ProgrammerProgrammer
2,9251851103
2,9251851103
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
Use a lambda, it will work like a charm:
b1->SetCB([&](){a1->Show();});
You may want to move
the callback as well:
void B::SetCB(std::function<void(void)> callb)
{
cb = std::move(callb);
}
Thanks - please explain that do we need to move the callback as well as you have stated "may want to move" - why?
– Programmer
Nov 25 '18 at 15:23
You don't have to move it, but if you have a callback more complex, with states and other things, there is no need to copy it when you can simply move it at a lower cost.
– Matthieu Brucher
Nov 25 '18 at 15:27
Just a another questions what if we have arguments to be passed using std::placeholders ?
– Programmer
Nov 25 '18 at 15:32
2
Themove
won't actually save anything if the states are not sophisticated. For example, moving a pointer or an int or a float won't do anything special. But for more complex states, like a string or a vector, then a move is of potential benefit.
– Eljay
Nov 25 '18 at 15:35
I think @Eljay summed it well!
– Matthieu Brucher
Nov 25 '18 at 15:37
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
});
}
});
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%2f53468870%2fset-callback-function-using-unique-ptr-of-another-class%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Use a lambda, it will work like a charm:
b1->SetCB([&](){a1->Show();});
You may want to move
the callback as well:
void B::SetCB(std::function<void(void)> callb)
{
cb = std::move(callb);
}
Thanks - please explain that do we need to move the callback as well as you have stated "may want to move" - why?
– Programmer
Nov 25 '18 at 15:23
You don't have to move it, but if you have a callback more complex, with states and other things, there is no need to copy it when you can simply move it at a lower cost.
– Matthieu Brucher
Nov 25 '18 at 15:27
Just a another questions what if we have arguments to be passed using std::placeholders ?
– Programmer
Nov 25 '18 at 15:32
2
Themove
won't actually save anything if the states are not sophisticated. For example, moving a pointer or an int or a float won't do anything special. But for more complex states, like a string or a vector, then a move is of potential benefit.
– Eljay
Nov 25 '18 at 15:35
I think @Eljay summed it well!
– Matthieu Brucher
Nov 25 '18 at 15:37
add a comment |
Use a lambda, it will work like a charm:
b1->SetCB([&](){a1->Show();});
You may want to move
the callback as well:
void B::SetCB(std::function<void(void)> callb)
{
cb = std::move(callb);
}
Thanks - please explain that do we need to move the callback as well as you have stated "may want to move" - why?
– Programmer
Nov 25 '18 at 15:23
You don't have to move it, but if you have a callback more complex, with states and other things, there is no need to copy it when you can simply move it at a lower cost.
– Matthieu Brucher
Nov 25 '18 at 15:27
Just a another questions what if we have arguments to be passed using std::placeholders ?
– Programmer
Nov 25 '18 at 15:32
2
Themove
won't actually save anything if the states are not sophisticated. For example, moving a pointer or an int or a float won't do anything special. But for more complex states, like a string or a vector, then a move is of potential benefit.
– Eljay
Nov 25 '18 at 15:35
I think @Eljay summed it well!
– Matthieu Brucher
Nov 25 '18 at 15:37
add a comment |
Use a lambda, it will work like a charm:
b1->SetCB([&](){a1->Show();});
You may want to move
the callback as well:
void B::SetCB(std::function<void(void)> callb)
{
cb = std::move(callb);
}
Use a lambda, it will work like a charm:
b1->SetCB([&](){a1->Show();});
You may want to move
the callback as well:
void B::SetCB(std::function<void(void)> callb)
{
cb = std::move(callb);
}
answered Nov 25 '18 at 15:14
Matthieu BrucherMatthieu Brucher
15k32140
15k32140
Thanks - please explain that do we need to move the callback as well as you have stated "may want to move" - why?
– Programmer
Nov 25 '18 at 15:23
You don't have to move it, but if you have a callback more complex, with states and other things, there is no need to copy it when you can simply move it at a lower cost.
– Matthieu Brucher
Nov 25 '18 at 15:27
Just a another questions what if we have arguments to be passed using std::placeholders ?
– Programmer
Nov 25 '18 at 15:32
2
Themove
won't actually save anything if the states are not sophisticated. For example, moving a pointer or an int or a float won't do anything special. But for more complex states, like a string or a vector, then a move is of potential benefit.
– Eljay
Nov 25 '18 at 15:35
I think @Eljay summed it well!
– Matthieu Brucher
Nov 25 '18 at 15:37
add a comment |
Thanks - please explain that do we need to move the callback as well as you have stated "may want to move" - why?
– Programmer
Nov 25 '18 at 15:23
You don't have to move it, but if you have a callback more complex, with states and other things, there is no need to copy it when you can simply move it at a lower cost.
– Matthieu Brucher
Nov 25 '18 at 15:27
Just a another questions what if we have arguments to be passed using std::placeholders ?
– Programmer
Nov 25 '18 at 15:32
2
Themove
won't actually save anything if the states are not sophisticated. For example, moving a pointer or an int or a float won't do anything special. But for more complex states, like a string or a vector, then a move is of potential benefit.
– Eljay
Nov 25 '18 at 15:35
I think @Eljay summed it well!
– Matthieu Brucher
Nov 25 '18 at 15:37
Thanks - please explain that do we need to move the callback as well as you have stated "may want to move" - why?
– Programmer
Nov 25 '18 at 15:23
Thanks - please explain that do we need to move the callback as well as you have stated "may want to move" - why?
– Programmer
Nov 25 '18 at 15:23
You don't have to move it, but if you have a callback more complex, with states and other things, there is no need to copy it when you can simply move it at a lower cost.
– Matthieu Brucher
Nov 25 '18 at 15:27
You don't have to move it, but if you have a callback more complex, with states and other things, there is no need to copy it when you can simply move it at a lower cost.
– Matthieu Brucher
Nov 25 '18 at 15:27
Just a another questions what if we have arguments to be passed using std::placeholders ?
– Programmer
Nov 25 '18 at 15:32
Just a another questions what if we have arguments to be passed using std::placeholders ?
– Programmer
Nov 25 '18 at 15:32
2
2
The
move
won't actually save anything if the states are not sophisticated. For example, moving a pointer or an int or a float won't do anything special. But for more complex states, like a string or a vector, then a move is of potential benefit.– Eljay
Nov 25 '18 at 15:35
The
move
won't actually save anything if the states are not sophisticated. For example, moving a pointer or an int or a float won't do anything special. But for more complex states, like a string or a vector, then a move is of potential benefit.– Eljay
Nov 25 '18 at 15:35
I think @Eljay summed it well!
– Matthieu Brucher
Nov 25 '18 at 15:37
I think @Eljay summed it well!
– Matthieu Brucher
Nov 25 '18 at 15:37
add a comment |
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%2f53468870%2fset-callback-function-using-unique-ptr-of-another-class%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