weak_result.pass.cpp revision b64f8b07c104c6cc986570ac8ee0ed16a9f23976
1//===----------------------------------------------------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is dual licensed under the MIT and the University of Illinois Open 6// Source Licenses. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10// <functional> 11 12// reference_wrapper 13 14// has weak result type 15 16#include <functional> 17#include <type_traits> 18 19class functor1 20 : public std::unary_function<int, char> 21{ 22}; 23 24class functor2 25 : public std::binary_function<char, int, double> 26{ 27}; 28 29class functor3 30 : public std::unary_function<char, int>, 31 public std::binary_function<char, int, double> 32{ 33public: 34 typedef float result_type; 35}; 36 37class functor4 38 : public std::unary_function<char, int>, 39 public std::binary_function<char, int, double> 40{ 41public: 42}; 43 44class C {}; 45 46template <class T> 47struct has_result_type 48{ 49private: 50 struct two {char _; char __;}; 51 template <class U> static two test(...); 52 template <class U> static char test(typename U::result_type* = 0); 53public: 54 static const bool value = sizeof(test<T>(0)) == 1; 55}; 56 57int main() 58{ 59 static_assert((std::is_same<std::reference_wrapper<functor1>::result_type, 60 char>::value), ""); 61 static_assert((std::is_same<std::reference_wrapper<functor2>::result_type, 62 double>::value), ""); 63 static_assert((std::is_same<std::reference_wrapper<functor3>::result_type, 64 float>::value), ""); 65 static_assert((std::is_same<std::reference_wrapper<void()>::result_type, 66 void>::value), ""); 67 static_assert((std::is_same<std::reference_wrapper<int*(double*)>::result_type, 68 int*>::value), ""); 69 static_assert((std::is_same<std::reference_wrapper<void(*)()>::result_type, 70 void>::value), ""); 71 static_assert((std::is_same<std::reference_wrapper<int*(*)(double*)>::result_type, 72 int*>::value), ""); 73 static_assert((std::is_same<std::reference_wrapper<int*(C::*)(double*)>::result_type, 74 int*>::value), ""); 75 static_assert((std::is_same<std::reference_wrapper<int (C::*)(double*) const volatile>::result_type, 76 int>::value), ""); 77 static_assert((std::is_same<std::reference_wrapper<C()>::result_type, 78 C>::value), ""); 79 static_assert(has_result_type<std::reference_wrapper<functor3> >::value, ""); 80 static_assert(!has_result_type<std::reference_wrapper<functor4> >::value, ""); 81 static_assert(!has_result_type<std::reference_wrapper<C> >::value, ""); 82} 83