[libsigc++2] Fix test_cpp11_lambda for gcc 4.8
- From: Kjell Ahlstedt <kjellahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libsigc++2] Fix test_cpp11_lambda for gcc 4.8
- Date: Sat, 26 Oct 2013 08:55:19 +0000 (UTC)
commit cd600a31fbf8e76e25f4be4c10c0645f090a9b80
Author: Kjell Ahlstedt <kjell ahlstedt bredband net>
Date: Sat Oct 26 10:46:24 2013 +0200
Fix test_cpp11_lambda for gcc 4.8
* tests/test_cpp11_lambda.cc: Remove an unneccesary std::ref().
Show that std::bind() can be assigned to a slot, if it's combined with
std::function.
tests/test_cpp11_lambda.cc | 31 ++++++++++++++++++++++++++++++-
1 files changed, 30 insertions(+), 1 deletions(-)
---
diff --git a/tests/test_cpp11_lambda.cc b/tests/test_cpp11_lambda.cc
index 463c69e..f3d6f09 100644
--- a/tests/test_cpp11_lambda.cc
+++ b/tests/test_cpp11_lambda.cc
@@ -300,8 +300,10 @@ int main(int argc, char* argv[])
util->check_result(result_stream, "foo(int 2, int 1) 9");
//std::cout << (sigc::group(sigc::mem_fun(&bar::test), _1, _2, _3)) (sigc::ref(the_bar), 1, 2) <<
std::endl;
+ // std::ref(the_bar) is not necessary. It can make the call ambiguous.
+ // Even without std::ref() the_bar is not copied.
result_stream << std::bind(std::mem_fn(&bar::test), std::placeholders::_1,
- std::placeholders::_2, std::placeholders::_3)(std::ref(the_bar), 1, 2);
+ std::placeholders::_2, std::placeholders::_3)(the_bar, 1, 2);
util->check_result(result_stream, "bar::test(int 1, int 2) 6");
// same functionality as bind
@@ -317,6 +319,13 @@ int main(int argc, char* argv[])
std::bind(sigc::ptr_fun(&foo_void), 1)();
util->check_result(result_stream, "foo_void(int 1)");
+ // std::bind() does not work well together with sigc::slot and sigc::signal::connect().
+ // std::bind() typically creates a functor whose operator()() is a variadic template.
+ // SIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE can't deduce the result type
+ // of such a functor.
+ // If the result of std::bind() is assigned to a std::function, the created
+ // functor has an unambiguous operator()().
+
// auto-disconnect
sigc::slot<void> sl2;
{
@@ -337,6 +346,26 @@ int main(int argc, char* argv[])
sl2();
util->check_result(result_stream, "");
+ // More auto-disconnect
+ {
+ book guest_book("charlie");
+ //sl2 = sigc::group(&egon, sigc::ref(guest_book));
+ // sl2 = std::bind(&egon, std::ref(guest_book)); // does not compile (gcc 4.6.3)
+ std::function<void()> fn2 = std::bind(&egon, std::ref(guest_book));
+ //sl2 = fn2; // no auto-disconnect
+ sl2 = sigc::track_obj(fn2, guest_book);
+ sl2();
+ util->check_result(result_stream, "egon(string 'charlie')");
+
+ //std::cout << static_cast<std::string&>(guest_book) << std::endl;
+ result_stream << static_cast<std::string&>(guest_book);
+ util->check_result(result_stream, "egon was here");
+
+ } // auto-disconnect
+
+ sl2();
+ util->check_result(result_stream, "");
+
// same functionality as hide
//std::cout << (sigc::group(&foo, _1, _2)) (1,2,3) << std::endl;
result_stream << std::bind(&foo, std::placeholders::_1, std::placeholders::_2)(1,2,3);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]