Compare commits

...

443 Commits

Author SHA1 Message Date
9e05c49c7d Merge branch 'develop' 2017-02-27 12:06:40 +00:00
551502a4a0 Update history. 2017-02-27 12:06:11 +00:00
2efc763afc Merge branch 'develop' 2017-02-27 12:03:03 +00:00
37955f2360 Merge pull request #29 from glenfe/develop
Add multiple type support to pre-C++11 void_t alias
2017-02-08 18:19:32 +00:00
fe7317d1ba Add multiple type support to pre-C++11 void_t alias 2017-02-07 18:04:31 -05:00
7b29d67a3e Small improvements to make_void:
* When there are no variadic templates, supports up to 5 parameters.
* Tests added for void_t.
* Documentation added on compiler support.
2017-02-07 18:49:33 +00:00
f59467e310 Merge branch 'develop' of https://github.com/glenfe/type_traits into pr28 2017-02-07 18:31:38 +00:00
9898e1684e Merge pull request #27 from zerotypos-found/inspection_report
[inspection report] remove tabs and non-ASCII chars, add newline, etc.
2017-02-07 18:27:13 +00:00
d24f722c5a Add make_void and void_t traits 2017-01-30 19:50:38 -05:00
c3b38bc3dd [inspection report] remove tabs and non-ASCII chars, add newline at EOF, fix copyright 2016-11-29 12:05:30 +09:00
f6c6a3ef9f Add, and update, documentation build targets. 2016-10-10 11:39:54 -05:00
4fffc7637d Add, and update, documentation build targets. 2016-10-07 23:07:37 -05:00
627832e519 Merge branch 'develop'
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2016-08-10 18:27:24 +01:00
5f82b5ac50 Suppress msvc-14 warning. 2016-05-08 18:13:26 +01:00
4243962e40 Conditionally stop using outdated msvc workarounds. 2016-05-08 18:12:57 +01:00
97cea143b9 Add and comment cstddef includes whenever std::size_t is used.
See https://svn.boost.org/trac/boost/ticket/12124.
2016-04-13 18:36:03 +01:00
8637711758 Merge branch 'develop' 2016-04-13 17:54:17 +01:00
b93bed1313 Merge branch 'develop' 2016-04-13 17:53:33 +01:00
01f41ec30e Merge branch 'develop'
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2016-04-01 18:26:57 +01:00
38cbf9df96 Merge pull request #24 from MarcelRaad/fix_clang_msvc
Fixes for clang in MSVC mode
2016-03-18 10:11:53 +00:00
f7e1f2d52e Change #includes to use angle brackets.
See https://svn.boost.org/trac/boost/ticket/11516.
2016-03-12 17:18:24 +00:00
2b64ca10e5 Change #includes to angle brackets.
See https://svn.boost.org/trac/boost/ticket/11516.
2016-03-12 17:05:27 +00:00
4cf4d9c191 Merge branch 'develop' 2016-02-15 19:10:30 +00:00
71c6fea390 Fixes for clang in MSVC mode
In MSVC mode, clang doesn't define __GNUC__.
Also, it doesn't define __clang, but defines __clang__.
2016-02-12 14:55:56 +01:00
1f3a3a1553 Fixes for older GCC versions, see issue 11904. 2016-01-13 10:50:22 +00:00
0bbffe0176 Manually revert accidental commit of tentative CUDA changes. 2016-01-11 13:47:46 +00:00
c526c89267 Update docs. 2016-01-11 13:45:41 +00:00
23d6106101 Revert "Update docs."
This reverts commit 1f65f0351d.
2016-01-11 13:44:51 +00:00
1f65f0351d Update docs. 2016-01-10 18:53:10 +00:00
217c337233 Fix result of add_reference<const void>.
Also update tests.
See https://svn.boost.org/trac/boost/ticket/11900.
2016-01-10 18:10:17 +00:00
70afe1dd0d Merge pull request #23 from gjasny/rename_check_for_apple
Change check to s_check (like #8542)
2015-12-30 18:38:01 +00:00
f80cbb0dad Change check to s_check (like #8542) 2015-12-29 20:41:10 +01:00
bc58964228 Disable wchar_t usage when it's not available.
See https://svn.boost.org/trac/boost/ticket/11870.
2015-12-28 18:53:44 +00:00
a0140edf50 Merge branch 'develop' 2015-12-13 12:49:42 +00:00
08cb0bba32 Add missing #include. 2015-12-12 13:19:12 +00:00
bc8a92c7b6 Suppress use of noexcept for gcc-4.6 as it doesn't handle all failure cases correctly. 2015-12-12 13:15:34 +00:00
58d70ed28b Add tests for https://svn.boost.org/trac/boost/ticket/11840. 2015-12-11 17:32:37 +00:00
b9c1ca01f5 Merge pull request #22 from scopeInfinity/changes
[type_traits] Fixed is_complex<T> with const types. Ticket #11840
2015-12-11 17:31:47 +00:00
dc272078fc [type_traits] Fixed is_complex<T> with const types. Ticket #11840 2015-12-11 20:01:01 +05:30
7d81a57758 Merge branch 'develop' 2015-12-08 19:12:44 +00:00
26531e7e2c Merge branch 'develop' of https://github.com/boostorg/type_traits into develop 2015-12-06 12:12:47 +00:00
f176e0a26d Apply patch https://svn.boost.org/trac/boost/ticket/11831 for clang. 2015-12-06 11:58:11 +00:00
0de68d2722 Merge pull request #21 from Lastique/patch-1
Fix a preprocessor warning on Intel compiler
2015-11-11 12:50:23 +00:00
40fada5956 Fix a preprocessor warning on Intel compiler
Replaced incorrect "#else if" sequence with "#elif". This fixes "warning #14: extra text after expected end of preprocessing directive".
2015-11-11 13:17:02 +03:00
4154c00265 Fix has_trivial_copy on Intel 16. 2015-11-09 18:48:21 +00:00
946221e550 Fix has_nothrow_copy on Intel-16 / Windows. 2015-11-09 13:41:33 +00:00
f0021b147e Merge branch 'develop' 2015-10-15 10:46:41 +01:00
1a5f11bb5a Second patch that makes all common type tests happy. 2015-09-19 23:09:46 +02:00
2f3fecf3f5 First patches for MSVC-7.1 2015-09-19 22:27:38 +02:00
f1f534a923 Merge pull request #19 from igaztanaga/patch-1
Workaround for old compilers like MSVC 7.1
2015-09-15 08:50:14 +01:00
7d4bb24bf6 Workaround for old compilers like MSVC 7.1
Without the indirection, a compilation error was triggered in line 106
2015-09-14 22:03:04 +02:00
e275dfc275 Merge pull request #18 from Lastique/fix_permissions
Remove executable permissions from headers.
2015-09-14 09:15:49 +01:00
99576a12f6 Remove executable permissions from headers. 2015-09-13 21:20:51 +03:00
0f82e72f34 Merge branch 'develop' 2015-09-13 09:34:56 +01:00
5fcd9c3fd4 Merge pull request #17 from ldionne/bugfix/integral_constant
Add missing value_type typedef in integral_constant<bool> specialization
2015-09-13 08:18:19 +01:00
f1bb7f979c Add missing ::value_type typedef in integral_constant<bool> specialization 2015-09-12 19:13:21 -04:00
1b18be716f Remove v2 changelog from master - we don't need it here, it's just for admin. 2015-09-12 11:26:56 +01:00
8151879fb2 Merge branch 'develop' 2015-09-12 11:25:05 +01:00
e5c0382a1b Update change log. 2015-09-12 11:24:30 +01:00
f083968ba6 Update to use new BOOST_HAS_FLOAT128, plus more tests. 2015-08-13 17:53:33 +01:00
39660c2421 Add __float128 specialization for is_floating_point. 2015-08-13 13:22:32 +01:00
a0a9475d17 Stop testing things that can't possibly pass (compiler features not available). 2015-07-24 10:07:27 +01:00
14d595e260 Fix a few more MSVC-14 failures. 2015-07-24 10:04:44 +01:00
98954e1d15 Fix test case. 2015-07-23 19:22:28 +01:00
b03c2df9c3 Disable __alignof usage by clang when it emulating GCC and GCC's behavior is buggy. 2015-07-10 13:15:00 +01:00
5d0cc6dca4 Fix duplicate definitions. 2015-07-10 13:05:31 +01:00
2fc6fea44b Add more missing checks for BOOST_NO_CXX11_RVALUE_REFERENCES, 2015-07-08 18:31:30 +01:00
ac4a37449d Add needed PP_guard around rvalue ref usage. 2015-07-08 16:42:38 +01:00
2d04c70520 Tentative fix for VC14.
Intrinsics behaviour seems to have changed compared to VC12.
2015-07-07 18:35:52 +01:00
50e7e269e5 Try and suppress some vc9 warnings. 2015-07-07 18:21:01 +01:00
312bf1d8ce Add some workarounds for GCC-4.4.x 2015-07-07 18:16:18 +01:00
04a8a9ecc2 Need to use __is_polymorphic intrinsic with msvc
when final is supported.
Also improve tests.
2015-07-07 12:30:28 +01:00
ebf5ae3b76 Disable has_nothrow_destructor for MSVC as appears not to work at present. 2015-06-20 17:50:10 +01:00
f5592c72c0 Fix template args to is_copy_constructible. 2015-06-20 12:47:01 +01:00
3267b296cf Fix correct include. 2015-06-19 09:25:27 +01:00
e19e733040 Regenerate docs and add missing files. 2015-06-18 11:26:28 +01:00
22fd60efe3 Merge branch 'Version2' into develop 2015-06-18 11:23:28 +01:00
d66cb6e905 Fix Oracle C++11 failure. 2015-06-17 19:29:25 +01:00
dca27f8b3d Fix Oracle failure - needs to filter result through is_constructible. 2015-06-17 19:13:19 +01:00
d9255a7958 Disable fully conforming is_convertible for gcc-4.6.4 as it fails our tests. 2015-06-17 18:17:42 +01:00
904a4adf00 Fix #include. 2015-06-16 19:32:27 +01:00
57134385f1 Use old version of is_copy_constructible with older GCC versions. 2015-06-16 19:23:37 +01:00
5a4f30208a More fixes for older GCC versions:
Don't filter through is_constructible/is_assignable etc as older GCC versions can't cope, and don't need these anyway.
2015-06-16 19:11:53 +01:00
9ab3aae3e6 Fix use of is_constructible - to limits to cases where it's really needed.
And to not use it when the compiler would choke.
2015-06-16 18:42:55 +01:00
863ba0a7c5 Revert "Move private-constructor tests into separate file."
This wasn't the right fix, and didn't fix the issue anyway.

This reverts commit fe5f4e2253.
2015-06-16 18:30:02 +01:00
fe5f4e2253 Move private-constructor tests into separate file.
These tests fail on older GCC versions.
2015-06-16 12:47:29 +01:00
fc2b8e14b9 Disable move-construction for arrays - fixes Oracle C++ issue. 2015-06-15 09:02:10 +01:00
821d5a177f Clean up macros after use. 2015-06-14 19:39:13 +01:00
b65423f1fa Fix comment. 2015-06-14 19:36:43 +01:00
642bf8377d More Oracle C++ fixes:
Disable noexcept code for is_destructible - Oracle seems to always return false.
Filter has_trivial_move_assign through is_assignable.
2015-06-14 19:34:26 +01:00
b554c5ae26 Oops should be using is_constructible not is_assignable in has_trivial_move_constructor.hpp. 2015-06-14 19:27:32 +01:00
d3a0be9f48 Fix for Oracle compiler thinking non-moveable types are POD's. 2015-06-14 19:17:21 +01:00
0408a8888f Add missing #include for Solaris. 2015-06-14 18:50:08 +01:00
6b7ed138b2 Stop including type_traits headers from intrinsics.hpp: it leads to cyclic dependencies. 2015-06-14 18:46:24 +01:00
136b7dbd7f Oracle has_nothrow_assign need to check for assignablility. 2015-06-14 18:27:57 +01:00
745bf9bee1 Fix for Oracle+STLPort. 2015-06-14 18:05:58 +01:00
4da98d4e8c Disable use of __oracle_has_nothrow_copy which appears not to do the right thing. 2015-06-14 13:20:18 +01:00
6f5f212fa0 Function types need to be screened out of is_pod on Oracle. 2015-06-14 13:06:23 +01:00
17985daa3c Add Oracle compiler to the list that needs extra includes. 2015-06-14 12:49:59 +01:00
693c7a9ca6 Fix for copy-constructibility with Oracle compiler. 2015-06-14 12:47:31 +01:00
c4243e2914 Ooops, revert to using add_reference for C++98 compilers. 2015-06-14 12:43:27 +01:00
979fc5b293 Delete dead file. 2015-06-14 09:31:45 +01:00
2f2ca65e48 Switch to using boost::declval.
Change has_nothrow_copy to use is_copy_constructible as it has better broken-compiler workarounds than is_constructible.
2015-06-14 09:30:46 +01:00
e68fddd992 Document new traits classes. 2015-06-13 19:19:22 +01:00
739956e561 Update type_traits.hpp to include lots of otherwise missing stuff. 2015-06-13 13:09:04 +01:00
68413905af Update more compiler requirements. 2015-06-12 19:37:19 +01:00
587298b93a Update compiler compatibility notes. 2015-06-12 18:44:01 +01:00
1c91d63197 Looks like some intrinsics are only available in C++11 mode. 2015-06-12 17:57:56 +01:00
cb98a630ff Change is_copy_constructible to use is_constructible where possible, and fix some MSVC failures. 2015-06-12 13:26:27 +01:00
ae76223bab Move trivial/nothrow construct traits closer into line with the standard. 2015-06-11 11:26:33 +01:00
b069b3ce3c Fix spelling of ::value ! 2015-06-11 11:01:18 +01:00
229e99880b Add missing #include to has_trivial_move_constructor.hpp 2015-06-11 10:59:52 +01:00
2fc65e67a8 Add missing #include to has_trivial_move_constructor.hpp. 2015-06-11 10:58:09 +01:00
d44141cf88 Fix behaviour of references and arrays in has_trivial_move_assign. 2015-06-11 10:57:11 +01:00
e8e7724303 Volatile types are not trivially movable. 2015-06-11 10:25:39 +01:00
11cd9e6674 Improve is_destructible - especially for references. 2015-06-11 10:13:30 +01:00
434e26e7a3 Improve is_destructible and add tests. 2015-06-11 10:00:31 +01:00
2d71379074 Fix has_trivial* traits and improve their tests. 2015-06-11 10:00:09 +01:00
24548d6158 Add missing #includes. 2015-06-11 09:58:39 +01:00
1dfcdd7bb2 Bring more docs up to date. 2015-06-11 09:57:56 +01:00
c0ca135b78 Add docs for undocumented has_nothrow_destructor trait. 2015-06-10 17:10:41 +01:00
79942e93cd More intrinsics corrections for clang 2015-06-09 19:38:05 +01:00
ade5857d78 Clang intrinsic needs to be filtered through is_constructible. 2015-06-09 19:33:07 +01:00
c1d885edbd Test nothrow_copy in no-intrinsics mode. 2015-06-09 18:52:17 +01:00
4777c0b4a6 Fix has_nothrow_destructor so it actually works.
Add tests for it.
2015-06-09 18:51:46 +01:00
05e1b3b7a5 Reduce trivial copy dependencies. 2015-06-09 18:51:04 +01:00
b21b0f0476 Fix test case: arrays are not explicitly copyable 2015-06-09 18:50:29 +01:00
4a16185e27 Improve is_constructible.
Add is_destructible.
Add tests.
2015-06-08 19:19:08 +01:00
bdd23b4b9b Merge branch 'develop' of https://github.com/boostorg/type_traits into develop 2015-06-08 17:17:49 +01:00
b7a24b7217 Merge pull request #15 from boostorg/feature/common_type_sfinae
Make common_type SFINAE-friendly, add tests
2015-06-08 17:17:28 +01:00
9fd4ee06b2 Make common_type SFINAE-friendly, add tests 2015-06-08 15:34:45 +03:00
8ed541ac23 Merge branch 'develop' of https://github.com/boostorg/type_traits into develop
Resolved Conflicts:
	doc/transform_traits.qbk
	doc/type_traits.qbk
2015-06-08 11:41:56 +01:00
d124da05c8 Merge pull request #14 from boostorg/feature/copy_cv_doc
Add copy_cv documentation.
2015-06-08 09:20:36 +01:00
965d6ed403 Merge pull request #13 from boostorg/feature/common_type
New implementation of common_type.
2015-06-08 09:18:28 +01:00
ef2d00be2a Use boost::int128_type to avoid GCC warnings.
Without this the type_traits tests fail as they use -Werror.
2015-06-08 09:18:00 +01:00
d97ca425ec Add first draft of is_constructible. 2015-06-08 09:06:39 +01:00
7a0c636208 Update nothrow_constructible tests. 2015-06-08 09:06:16 +01:00
719ea20756 Begin updating docs to match new code. 2015-06-08 09:05:40 +01:00
971fd13805 Remove unnecessary includes. 2015-06-08 02:03:14 +03:00
7cb0e840f1 Moved utility/declval.hpp to type_traits/declval.hpp. 2015-06-08 01:55:17 +03:00
01493e4acb Add a few more common_type tests. 2015-06-08 01:34:06 +03:00
b0f9674649 Add a test for copy_cv. 2015-06-08 01:08:18 +03:00
bc89aa6160 Add a type_identity test. 2015-06-08 00:54:19 +03:00
2180399398 Update documentation of common_type a bit. 2015-06-08 00:39:05 +03:00
987b01b28c Add documentation for declval. 2015-06-08 00:22:03 +03:00
2a645db56c Add documentation for type_identity as well. 2015-06-08 00:09:40 +03:00
d0dbb24faf Move copy_cv to its alphabetical place. 2015-06-08 00:01:09 +03:00
3d3463b639 Rename tp_identity to type_identity; add copy_cv.hpp and type_identity.hpp to type_traits.hpp. 2015-06-07 22:18:49 +03:00
5fcc741db4 Add copy_cv documentation. 2015-06-07 21:10:51 +03:00
2b957cfd55 Add missing include of boost/config.hpp. 2015-06-07 19:19:55 +03:00
ad1ddddaf4 New implementation of common_type. 2015-06-07 19:12:55 +03:00
acf6e41edb Add is_assignable.
Update has_nothrow_assign to make use of it.
2015-06-06 12:51:51 +01:00
34805a673f Improve has_nothrow_constructor with check for constructibility where required. 2015-06-05 18:08:35 +01:00
19b4c5c9ee Add first draft of is_default_constructible trait. 2015-06-05 18:07:27 +01:00
93aa34671b Remove inline namespace support - we're not using it. 2015-06-04 19:00:25 +01:00
916adca633 Add generic version of has_nothrow_assign.
Does not require a compiler intrinsic - makes it easier to port to other/unknown compilers going forward as long as they are C++11.
2015-06-04 18:59:21 +01:00
e31d0ab7bd Suppress VC++ analyzer warnings.
See https://svn.boost.org/trac/boost/ticket/9100.
2015-05-28 19:07:39 +01:00
e824cad0bd Fix indent. 2015-05-28 18:52:29 +01:00
d3ac8b95c4 Bring decay into line with std::decay.
See https://svn.boost.org/trac/boost/ticket/7760.
2015-05-28 18:33:31 +01:00
ab62bb1c14 Add missing #include. 2015-05-28 13:42:00 +01:00
3b86fe6cb4 Disable typeof when BOOST_COMMON_TYPE_DONT_USE_TYPEOF is set. 2015-05-28 13:13:45 +01:00
d57c36d056 Revert "Use typeof with recent Oracle compiler releases."
This reverts commit ef7436a729.
2015-05-27 18:26:01 +01:00
ef7436a729 Use typeof with recent Oracle compiler releases. 2015-05-27 18:22:48 +01:00
fb0c253a86 Add missing include for Oracle. 2015-05-27 18:17:35 +01:00
28b599d17e Add missing #include. 2015-05-27 18:14:47 +01:00
ec6b822957 Add missing Solaris #includes. 2015-05-27 18:10:14 +01:00
55ea6d614c Merge branch 'Version2' into develop 2015-05-22 13:18:48 +01:00
286d08b1ea Mark those changes that have been merged. 2015-05-22 13:17:18 +01:00
3b78213a41 Merge branch 'develop' into Version2 2015-05-21 19:37:33 +01:00
fe2dafdde1 Update PR list. 2015-05-21 19:35:51 +01:00
3ee10740eb Merge branch 'Version2' of https://github.com/boostorg/type_traits into Version2 2015-05-21 18:52:13 +01:00
b333158270 Merge branch 'develop' 2015-05-21 18:51:23 +01:00
9f489b0d71 Add tests to detect, https://svn.boost.org/trac/boost/ticket/11324. 2015-05-21 18:39:50 +01:00
64daadea88 Merge pull request #12 from AntonBikineev/Version2
Version2
2015-05-20 17:49:26 +01:00
eaa601cc38 Merge branch 'Version2' of https://github.com/AntonBikineev/type_traits into Version2 2015-05-20 10:30:37 -05:00
34fe226814 Added decaying to common_type in accordance with defect LWG2141 2015-05-20 10:29:22 -05:00
b3c24153c4 Test PR applied 2015-05-19 21:30:15 -04:00
b1c92f301f PR request for Boost Test 2015-05-19 12:28:32 -04:00
4fb3457fe2 Merge branch 'develop' into Version2 2015-05-17 11:45:08 +01:00
24b7d226d3 Add fix for false positives in is_virtual_base_of
See https://svn.boost.org/trac/boost/ticket/11309
2015-05-16 18:39:49 +01:00
ba1588ebc1 Updated pull requests for Version2 2015-04-27 19:34:19 -04:00
d6683b9759 Combine and put changes in alphabetical library order. 2015-04-27 03:41:29 -04:00
2fcd884d9c Updates for detail and variant 2015-04-02 12:43:26 -04:00
587401cc05 More changes noted, in iterator and function_types 2015-04-01 22:16:52 -04:00
7af948ad26 Chanbed name of detail is_signed implementation to avoid conflicts with numeric_traits detail is_signed implementation. 2015-04-01 17:57:51 -04:00
2b84e5f125 Changed to lexical_cast and lambda 2015-03-31 03:41:01 -04:00
eff5109f0c Put out correct deprecated message. 2015-03-31 00:39:14 -04:00
65ac4ddc5a Put out correct deprecated message. 2015-03-31 00:35:50 -04:00
17885c80f1 Added pull request for boost detail 2015-03-30 02:32:21 -04:00
5ab8957b15 Added Boost function pull request 2015-03-30 01:58:47 -04:00
dcfd3a880b Revert "Make constexpr return values const to suppress clang warnings."
This reverts commit cae9001400.
2015-03-24 19:14:53 +00:00
52a3eeeda4 Make constexpr functions const. 2015-03-24 19:05:32 +00:00
cae9001400 Make constexpr return values const to suppress clang warnings. 2015-03-24 19:04:08 +00:00
703aa0c3b3 Fix clang compilation failure. 2015-03-24 19:01:08 +00:00
080125fffd Merge branch 'develop' 2015-03-19 14:29:51 +01:00
d3cf98115f Merge pull request #11 from akumta/patch-1
Update type_with_alignment.hpp
2015-03-12 19:30:39 +00:00
70345d87d3 Update type_with_alignment.hpp
Update for ticket # 11096.
2015-03-10 09:46:46 -07:00
defa583eba Fix template param name. 2015-02-28 16:58:02 +00:00
258c80886a Add some namespace prefixes to avoid ambiguities. 2015-02-28 16:55:32 +00:00
13c3530448 Fix preprocessor logic, and add missing #include. 2015-02-26 19:11:18 +00:00
e1b4d57733 Merge branch 'develop' 2015-02-23 18:17:21 +00:00
c348b224da Add intrinsic support for Oracle compiler. 2015-02-21 19:06:47 +00:00
13af122a06 Revert "Add intrinsics for Oracle compiler."
This reverts commit 3c6adff2fd.
2015-02-21 19:04:27 +00:00
3c6adff2fd Add intrinsics for Oracle compiler. 2015-02-21 19:02:46 +00:00
93d3c87b5d Merge branch 'develop' 2015-02-14 18:00:52 +00:00
90fca0f64b Reorganise #includes to reduce dependencies - only legacy compilers should depend on anything other than Boost.Config now. 2015-01-31 09:58:35 +00:00
d5465b7801 Merge pull request #10 from alexhenrie/develop
Correct spelling of "suppress"
2015-01-30 20:02:09 -05:00
ad30bf473b Correct spelling of "suppress" 2015-01-30 17:52:03 -07:00
18f8c75289 is_signed and is_unsigned need to inherit from integral_constant. 2015-01-29 11:46:31 +00:00
d584c75252 Add definitions of ::value members. 2015-01-27 16:30:05 +00:00
adf29f0d3f Update pending changes. 2015-01-26 12:48:59 +00:00
1f96f4732a Add back old deprecated header. 2015-01-24 18:16:31 +00:00
5594993c44 Update status. 2015-01-24 18:06:52 +00:00
a685e20578 Fix mpl conceptual failure. 2015-01-22 17:50:18 +00:00
d834d7aeab Update needed changes in other libs. 2015-01-22 16:31:42 +00:00
3c3071e4ef Fix buggy decay. 2015-01-22 09:17:40 +00:00
ea25faa853 Add some more missing #includes. 2015-01-21 19:46:18 +00:00
e1b4b91692 Add notes on changes required by other libs. 2015-01-21 19:11:47 +00:00
e1b1831b79 Fix issue that occurs when wchar_t is not a native type - still an option for msvc. 2015-01-21 18:32:26 +00:00
fb7b527c37 Fix nasty bug in aligned storage. 2015-01-21 18:04:55 +00:00
abe3c03295 Merge branch 'Version2' of https://github.com/boostorg/type_traits into Version2 2015-01-21 16:50:38 +00:00
7513e68882 Added include for BOOST_WORKAROUND. 2015-01-20 19:13:06 -05:00
5a2ab9ffb0 Fix iostreams lib failures, and some some conceptual errors. 2015-01-20 18:14:59 +00:00
81c4b8f860 Fix function_types failures. 2015-01-20 17:40:32 +00:00
60547bfef9 Fix bug in aligned_storage.hpp include guards. Add back some detail headers that other libraries are using. 2015-01-20 13:06:27 +00:00
8f94dbbf35 Inline namespace test version. 2015-01-18 11:39:05 +00:00
3435d48f0e Add the remaining traits - only common_type still has dependencies to something other than Boost.Config. 2015-01-17 19:08:08 +00:00
94eb94980e Add more traits back - nearly complete now. 2015-01-17 18:06:27 +00:00
6aa0878fb3 Add some more traits back. 2015-01-17 13:35:26 +00:00
1b1f90fdea Remove dependency on ice.hpp for operator traits. 2015-01-17 12:00:22 +00:00
fe41f0a4c1 Add operator traits and tests. 2015-01-16 18:30:26 +00:00
c4c10e06c6 Add new versions of decay, extent, function_traits. 2015-01-15 18:23:35 +00:00
6bbee3cc59 Add new versions of alignment traits. 2015-01-15 17:05:05 +00:00
8dc33362b9 Convert some more traits. 2015-01-15 11:31:18 +00:00
3cf613228d Fix Linux #include issues. 2015-01-14 19:17:10 +00:00
f0da159e1f Initial commit of new version of type_traits which has zero dependencies (other than Boost.Config), plus reduced template instantiations, and cleaner easier to read code. 2015-01-14 18:34:11 +00:00
5f0de298dc Merge branch 'develop' 2014-12-11 15:50:01 +00:00
6a8708a128 Update history. 2014-12-11 15:49:21 +00:00
cf42ce1cfd Fix version check. 2014-12-06 09:38:35 +00:00
ffa9927732 Add new hooks for nothrow move assign/construct and fix is_nothrow_move_assignable and is_nothrow_move_constructible for msvc-12 and later. 2014-12-05 18:30:54 +00:00
c76c7cc1ad Update history and regen docs. 2014-11-10 18:01:17 +00:00
9b12c8ad6a Fix for CUDA on Clang compilation failure when including type traits headers.
See https://svn.boost.org/trac/boost/ticket/10694.
2014-11-10 17:58:14 +00:00
f71cdfc11e Merge branch 'develop' 2014-10-30 10:47:21 +00:00
817d036e1e Update history, regenerate docs. 2014-10-30 10:46:19 +00:00
81b951012d Merge branch 'develop' 2014-10-26 13:42:16 +01:00
9ad41f9ff6 Remove unneeded is_const.
Tidy up special cases.
2014-10-20 11:50:47 +01:00
5c0474dbc7 Improve is_nothrow* tests.
Disable is_nothrow* full implementation when there's no SFINAE expressions and simplify implementation.
2014-10-19 17:45:57 +01:00
a838eafd5e Merge branch 'develop' 2014-10-19 08:41:03 +01:00
ffd5e058b3 Merge branch 'develop' 2014-10-18 16:52:53 +01:00
9de6a4924e Merge pull request #8 from MarcelRaad/patch-1
Compile fix for MSVC14
2014-09-25 10:34:44 +01:00
c845f41f2d Compile fix for MSVC14
MSVC14 supports noexcept, but doesn't support expression SFINAE, so false_or_cpp11_noexcept_move_assignable<const T> fails to compile with
error C3892: 'boost::declval': you cannot assign to a variable that is const

Disabling the overload for const types so that they are never reported as noexcept move assignable fixes the compile error. Of course this doesn't work for imaginary UDTs with an assignment operator that is marked both noexcept and const - the alternative would be to guard the block with BOOST_NO_SFINAE_EXPR in addition to BOOST_NO_CXX11_NOEXCEPT.
2014-09-24 14:32:04 +02:00
6b92cc7e26 Fix C++11 syntax error 2014-09-22 18:09:12 +01:00
7e8ed98615 Include is_copy_assignable in doc build. 2014-08-31 18:51:58 +01:00
79b690140e Merge branch 'is_copy_assignable' of https://github.com/igaztanaga/type_traits into develop 2014-08-31 18:24:26 +01:00
383c44d577 Merge branch 'develop' of https://github.com/boostorg/type_traits into develop 2014-08-31 10:47:34 +01:00
497b877d15 Incrementable and decrementable traits failed to compile with array types: fix that by filtering out arrays early. 2014-08-30 09:19:06 +01:00
cf18d2bbac is_copy_assignable implementation added. It needs C++11 support to work reliable. 2014-08-26 23:23:12 +02:00
bbcfff0278 Fix clang is_convertible test failure - we don't need to check for abstract targets as clang does the right thing. 2014-08-23 13:26:15 +01:00
df74811a4c Fix has_trivial_copy so that non-copyable types are never trivially copyable! Also fix clang to detect trivially copyable array types. 2014-08-23 12:20:26 +01:00
c0a2a3c012 Merge pull request #5 from igaztanaga/msvc-12.0_is_copy_constructible_fix
Fix for MSVC 12.0 std::is_copy_constructible and boost::is_copy_construc...
2014-08-20 18:16:45 +01:00
0e78687e7d Fix test case:
* Don't test incomplete types.
* Use new BOOST_NO_CXX11_FINAL macro for checks.
* Use soft checks when no compiler support is present.
2014-08-20 18:15:30 +01:00
6f6e288daf Oops, move gcc config to correct section. 2014-08-20 18:13:21 +01:00
0c7df66d0e Merge branch 'is_final' of https://github.com/K-ballo/type_traits into develop 2014-08-20 17:22:23 +01:00
5d936acc05 Added is_final type trait. Added BOOST_IS_FINAL intrinsic. 2014-08-19 14:45:00 -03:00
ee65713b9e Merge pull request #6 from danieljames/metadata
Create metadata file.
2014-08-18 17:38:07 +01:00
d11a87472a Add metadata file. 2014-08-18 15:11:59 +01:00
dea1f79512 Fix for MSVC 12.0 std::is_copy_constructible and boost::is_copy_constructible return true for types with deleted copy constructors 2014-08-18 01:09:13 +02:00
2131823bc2 Merge pull request #3 from K-ballo/typo-varaible
Fixed typo varaible -> variable
2014-08-15 18:26:19 +01:00
9b3c90a320 Fixed typo varaible -> variable 2014-07-18 21:59:23 -03:00
74b5bea140 Partially revert "Fixes for msvc-13."
This reverts commit e69dd6740a.
2014-07-17 13:21:19 +01:00
e9fbf0eaee Merge branch 'develop' 2014-07-09 19:04:22 +01:00
b80c87f837 Merge pull request #2 from MarcelRaad/develop
compile fix for tests with TEST_STD defined
2014-07-09 18:57:43 +01:00
ada1f1b831 compile fix for tests with TEST_STD defined 2014-07-03 21:05:17 +02:00
b2631acb58 Merge branch 'develop' 2014-06-05 17:22:35 +03:00
3a6fa37355 Tweak comments (removing a non-ascii character, updating references to the C++11 standard, etc.) and rename the include guard macro.
[SVN r81112]
2014-06-05 17:22:27 +03:00
abd3f9a3d6 Utility/declval: update history.
[SVN r78729]
2014-06-05 17:22:26 +03:00
d3f4c2daf0 Utility: Rollback unwanted commit while adding noexcept to boost::declval
[SVN r77562]
2014-06-05 17:22:26 +03:00
a4b03d930c Utility: Fix for Adding noexcept to boost::declval
[SVN r77552]
2014-06-05 17:22:25 +03:00
d0b1fdb484 Utility: Added doc for Adding noexcept to boost::declval
[SVN r77543]
2014-06-05 17:22:25 +03:00
f981615a99 Utility: Apply patch for 6570: Adding noexcept to boost::declval
[SVN r77539]
2014-06-05 17:22:24 +03:00
9b4b60d87a Fix doc errors reported by Rob Stewart. Fixes #5421.
[SVN r71047]
2014-06-05 17:22:24 +03:00
393edd855b Add declval and common type from Vicente J. Botet Escriba. Regenerate docs.
[SVN r65443]
2014-06-05 17:22:23 +03:00
8ced326b70 Tweak comments (removing a non-ascii character, updating references to the C++11 standard, etc.) and rename the include guard macro.
[SVN r81112]
2014-06-05 17:21:59 +03:00
9dca8381fe Utility/declval: update history.
[SVN r78729]
2014-06-05 17:21:58 +03:00
00e3a56d57 Utility: Rollback unwanted commit while adding noexcept to boost::declval
[SVN r77562]
2014-06-05 17:21:57 +03:00
590d24cb2e Utility: Fix for Adding noexcept to boost::declval
[SVN r77552]
2014-06-05 17:21:56 +03:00
d6fd3f6ccb Utility: Added doc for Adding noexcept to boost::declval
[SVN r77543]
2014-06-05 17:21:56 +03:00
8fd600df47 Utility: Apply patch for 6570: Adding noexcept to boost::declval
[SVN r77539]
2014-06-05 17:21:55 +03:00
a04746196d Fix doc errors reported by Rob Stewart. Fixes #5421.
[SVN r71047]
2014-06-05 17:21:55 +03:00
88f5ca0bfd Add declval and common type from Vicente J. Botet Escriba. Regenerate docs.
[SVN r65443]
2014-06-05 17:21:54 +03:00
f00b6182ef Merge branch 'develop' 2014-06-05 10:08:58 +01:00
1f815065bb Fix gcc-4.9.0 warnings 2014-05-02 09:29:30 +01:00
3327d4c48f Fix doc bug: https://svn.boost.org/trac/boost/ticket/9967 2014-04-30 18:13:43 +01:00
03bff14498 Updated fix for https://svn.boost.org/trac/boost/ticket/9910#comment:2
C++11 version of is_convertible does not need a check for is_abstract.
2014-04-27 16:51:19 +01:00
14d6a21eb1 Update docs on alignment traits. 2014-04-24 18:33:16 +01:00
f91ab70055 Apply fix for issue https://svn.boost.org/trac/boost/ticket/9910 which provides a C++11 conforming version of is_convertible. 2014-04-23 12:50:53 +01:00
3b12bbb0d6 regenerate docs and update history. 2014-04-22 09:27:48 +01:00
7c2d5eb2a6 Apply patches from https://svn.boost.org/trac/boost/ticket/7317
Fixes msvc-11 compile failures.
2014-04-22 09:22:35 +01:00
6100ef9bac Regenerate/update docs. 2014-04-21 09:47:34 +01:00
954cdb5e46 Add fix for https://svn.boost.org/trac/boost/ticket/9474 2014-04-21 09:39:19 +01:00
3c5c6a3be1 Merge branch 'develop' 2014-03-17 18:11:37 +00:00
261db898d9 Revert removal of obsolete headers as it breaks existing code.
See https://svn.boost.org/trac/boost/ticket/9783.
2014-03-17 18:06:31 +00:00
da8a57f9dc Change check to s_check.
Fixes https://svn.boost.org/trac/boost/ticket/8542
2014-03-13 18:20:53 +00:00
a0ae848ad2 GCC warning suppression. 2014-03-13 17:56:03 +00:00
1074233206 Fix warning under vc-11.0 2014-03-13 17:44:34 +00:00
890debddb2 Merge branch 'develop' 2014-03-13 17:37:03 +00:00
7f7cde4378 Remove obsolete #includes - reduces dependency burden. 2014-02-20 11:32:01 +00:00
787e28368d Change name of boost::align so it doesn't clash with other stuff. 2014-02-18 13:31:01 +00:00
c137710c27 Merge commit 'a291374a230b89161691f890637b2896459c0afd' into develop: sets up merge point for master->develop merges. 2014-02-16 18:20:50 +00:00
a291374a23 Manual merge of change missed by auto-merge. Master and develop should now be in synch. 2014-02-16 16:53:40 +00:00
acfc15eae3 Remove files which should never have been in Git. 2014-02-16 16:49:45 +00:00
2fe6e4f08b Remove files which should never have been in Git in the first place. 2014-02-16 16:47:52 +00:00
e347b45eef Merge branch 'develop' 2014-02-16 16:37:02 +00:00
8c0269c1c2 Setup first merge point in Git land. 2014-02-16 16:36:50 +00:00
e69dd6740a Fixes for msvc-13. 2014-02-08 16:19:14 +00:00
6f9d6798a7 Suppress spurious GCC warning. 2014-02-08 13:00:54 +00:00
a2b3727caf Fix some GCC warnings by actually testing the types generated. 2014-02-08 13:00:31 +00:00
e9ae20d161 Merge r86524 (Correct broken links to C++ standard papers); fixes #9212
[SVN r86673]
2013-11-13 03:22:55 +00:00
ba63463ab7 Correct broken links to C++ standard papers. Refs #9212.
[SVN r86524]
2013-10-30 12:51:24 +00:00
497c7c10e9 TypeTraits/common_type fix typo. fix #8785.
[SVN r86458]
2013-10-26 15:49:29 +00:00
31ceaf1b02 TypeTraits/common_type fix typo.
[SVN r86457]
2013-10-26 15:30:31 +00:00
d5c5988d92 Remove dead files.
[SVN r86300]
2013-10-14 15:25:21 +00:00
937009e771 Remove use of obsolete BOOST_TT_BROKEN_COMPILER_SPEC
[SVN r86250]
2013-10-11 23:23:26 +00:00
ad10d46cc5 Remove remaining occurances of BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
These evaded scripting.

[SVN r86249]
2013-10-11 23:22:36 +00:00
a7d4ca60cf Simplify multi-component ifdefs containing BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
[SVN r86248]
2013-10-11 23:20:59 +00:00
32f87190d6 Remove BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Process #elif...#else...#endif blocks.

[SVN r86247]
2013-10-11 23:19:44 +00:00
77697c2134 Remove BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Process #ifdef...#else...#endif blocks.

[SVN r86246]
2013-10-11 23:19:17 +00:00
f0b1834a4d Remove BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Process #ifndef...#else...#endif blocks.

[SVN r86245]
2013-10-11 23:17:48 +00:00
ea6264018d Remove BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Process #ifndef...#endif conditions.

[SVN r86244]
2013-10-11 23:15:00 +00:00
c8f38de386 Remove BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Process #ifdef...#endif blocks.

[SVN r86243]
2013-10-11 23:13:10 +00:00
7b3dfb6f0a Removed extraneous calling convention declarations for VC++ and compatibles when varargs is used.
[SVN r86214]
2013-10-09 14:54:36 +00:00
f53c38de37 aligned_storage: Remove obsolete GCC version check.
[SVN r86103]
2013-10-01 08:41:55 +00:00
7713e90dc3 TypeTraits: Remove obsolete GCC version checks.
[SVN r86077]
2013-09-30 16:01:57 +00:00
d1403c7d10 TypeTraits: Remove use of obsolete macro
BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING was only defined for GCC 2.

[SVN r86076]
2013-09-30 16:01:34 +00:00
df4224484f TypeTraits: Remove definition of macro for obsolete GCC.
[SVN r86075]
2013-09-30 16:01:16 +00:00
95587ab589 aligned_storage: Remove obsolete MSVC version check.
[SVN r86025]
2013-09-30 00:18:28 +00:00
f23fef070e Remove obsolete MSVC check from pragma guard
git grep -h -B1 "^#\s*pragma once" | grep -v pragma | sort | uniq

is now clean.

[SVN r85952]
2013-09-26 13:02:51 +00:00
81918230c6 TypeTraits: Remove obsolete MSVC version checks.
[SVN r85919]
2013-09-25 21:15:34 +00:00
dc676dc982 TypeTraits: Port away from obsolete macro.
[SVN r85918]
2013-09-25 21:14:42 +00:00
ed84feb8b2 TypeTraits: Remove use of obsolete macro.
[SVN r85917]
2013-09-25 21:14:24 +00:00
dec59cee34 TypeTraits: Remove alternative macro definitions for old MSVC.
[SVN r85916]
2013-09-25 21:14:01 +00:00
6d0830f46f Merge type traits from Trunk:
* Adds uchar16_t and uchar32_t support.
* Adds is_copy_constructible trait.

[SVN r85474]
2013-08-26 10:43:14 +00:00
5b7204632a Disable tests that can not be passed by intel compiler due to its usege of the is_copy_constructible trait in C++98/fallback mode (beacause of the bugs in SFINAE for deleted functions). (refs #8802)
[SVN r85357]
2013-08-15 15:17:40 +00:00
e236bd7c14 Intel compiler: do not use SFINAE with decltype/sizeof on deleted functions. Use fallback mode instead (refs #8802)
[SVN r85319]
2013-08-12 13:25:01 +00:00
4b93facaaa Atempt to workaround Intel issue with SFINAE (refs #8802)
[SVN r85222]
2013-08-06 15:37:00 +00:00
c646121426 Test is_copy_constructible trait on C++03/98 with Boost.Move emulation of noncopyable-movable type (refs #8802, refs #8842)
[SVN r85193]
2013-08-03 06:09:35 +00:00
a867293d57 Workaround some of the Intel warinings/bugs in the is_copy_constructible_tests file (refs #8802)
[SVN r85173]
2013-07-30 07:50:21 +00:00
2429f259cc Unify behavior of is_copy_constructible triat when dealing with rvalues + add comments for some tests (refs #8802):
[SVN r85104]
2013-07-22 12:51:09 +00:00
adfe8642af Fix tests for is_copy_constructible triat and fix reference-to-reference issue (refs #8802).
[SVN r85060]
2013-07-17 14:38:39 +00:00
449c859c9d Add support for char16_t and char32_t.
Fixes #8780.

[SVN r85019]
2013-07-12 18:28:17 +00:00
2131265b3d Fix tests build under MSVC for is_copy_constructible triat (refs #8802)
[SVN r85006]
2013-07-12 11:14:11 +00:00
e75060956c Improvemants for is_copy_constructible triat (refs #8802):
* Added small in-place documentation for trait
* Trait is now included by boost/type_traits.hpp header
* Added qbk documentation
* Documentation regenerated

[SVN r85002]
2013-07-11 10:27:49 +00:00
1feea65d89 Added is_copy_constructible triat implementation and tests (refs #8802)
[SVN r84987]
2013-07-09 07:49:44 +00:00
544307225b Remove reference to BOOST_TYPEOF_SILENT as it doesn't exist any more.
[SVN r84846]
2013-06-20 12:14:11 +00:00
554cb99bf1 Remove reference to BOOST_TYPEOF_SILENT as it doesn't exist any more.
[SVN r84845]
2013-06-20 12:13:47 +00:00
75abd7992c Change pp-code to fix #5809.
Fixes #5809.

[SVN r84837]
2013-06-19 17:39:35 +00:00
e7b1851330 Fix for #5809.
[SVN r84836]
2013-06-19 17:37:17 +00:00
c49466d872 Clarify that base classes include indirect ancestors.
Fixes #8407.

[SVN r84762]
2013-06-13 16:09:11 +00:00
03648e3664 Clarify that base classes include indirect ancestors.
Refs #8407.

[SVN r84761]
2013-06-13 16:06:30 +00:00
5cee0e2652 Fix typo in docs and regenerate.
Fixes #7639.

[SVN r84759]
2013-06-13 15:53:03 +00:00
314da4bb03 Fix typo in docs and regenerate.
Refs #7639.

[SVN r84757]
2013-06-13 15:48:59 +00:00
3874a62b66 Merge new traits & accumulated fixes from Trunk.
[SVN r83499]
2013-03-19 19:04:44 +00:00
79b4594c2b Fix messed up parenthesis.
[SVN r83473]
2013-03-17 16:02:13 +00:00
1554970121 Tentative fixes for remaining msvc-11 failures.
[SVN r83437]
2013-03-15 13:27:03 +00:00
2140b4c23c Added missing header for is_nothrow_move_constructible (refs #8189).
[SVN r83430]
2013-03-14 18:56:19 +00:00
0ef52c07fa Added C++11 specific tests for implementation of is_nothrow_move_constructible and is_nothrow_move_assignable traits (refs #8189).
[SVN r83365]
2013-03-08 15:52:46 +00:00
40d87a0683 Fix MSVC11 test (refs #8189).
Added C++11 noexcept implementation of is_nothrow_move_constructible and is_nothrow_move_assignable traits and changed C++03 version to to work close to C++11 (refs #8189).

[SVN r83245]
2013-03-02 16:15:30 +00:00
703afdc9c1 Added includes for new type triats to type_traits.hpp
[SVN r83242]
2013-03-02 08:36:39 +00:00
23bd369b77 Added documentation for new type traits (refs #8189)
HTML pages regenerated (refs #8189)

[SVN r83241]
2013-03-02 08:30:44 +00:00
6ddc6c1d51 Added new type traits (more documentation, more tests and improved C++11 specific features detection still must to be done) (refs #8189)
[SVN r83206]
2013-02-28 19:17:49 +00:00
8886da6e1b Removing a non-ascii character (i.e. a non-breaking space); fixes #8042.
[SVN r82830]
2013-02-12 15:29:39 +00:00
b64cca729d Add comment to the effect that is_POD is deprecated, and get it to forward to is_pod.
[SVN r82678]
2013-02-01 10:16:07 +00:00
fd843864fb Merge typo fixes from Michel Morin from Trunk.
Fixes #7683.

[SVN r82242]
2012-12-28 18:39:22 +00:00
2162f05dfc Apply patches to correct typos from Michel Morin.
Refs #7683.

[SVN r82241]
2012-12-28 18:21:09 +00:00
985ba7d10c Merge changes from Trunk.
[SVN r81829]
2012-12-10 18:11:39 +00:00
a921c555f1 TypeTraits: make it work with Borland
[SVN r81765]
2012-12-07 17:17:03 +00:00
9cd79c769e Removed usage of deprecated macros
[SVN r81554]
2012-11-26 16:59:41 +00:00
c64eb91a2b Remove usage of deprecated macros
[SVN r81466]
2012-11-21 21:11:24 +00:00
a103ebe7ed Update references to the C++11 standard.
[SVN r81113]
2012-10-30 17:01:59 +00:00
e6314963a3 Add initial support for __int128 to Config and TypeTraits
[SVN r81064]
2012-10-25 12:21:19 +00:00
a75ba5f2af Fix preprocessor usage (and synchronize the style); fixes #7306
[SVN r80325]
2012-08-31 03:30:51 +00:00
b95816426c Move new test cases into the "tricky" section as many compilers can't handle them.
Revert previous change that used std::is_convertible on GCC as it breaks code prior to gcc-4.7.
Fix MSVC intrinsic to handle function types better.
Filter out rvalue-refs from is_function.
Partially apply patch from #7251 to make is_convertible behave more according to C++11.
Refs #7251.

[SVN r80234]
2012-08-26 12:14:11 +00:00
c8294f4710 Adding is_convertible test for function types
[SVN r80081]
2012-08-19 02:05:55 +00:00
3bfd10465c Fixing is_convertible for function types; fixes #7246
[SVN r80080]
2012-08-19 02:03:07 +00:00
551385bd9c Remove stray ; in test file.
Add some rvalue ref tests for is_convertible.
Enable use of intrinsics for Intel on Win32.
Fix rvalue ref usage in is_convertible.

[SVN r79983]
2012-08-12 17:57:27 +00:00
8608d0a498 Merged accumulated bug fixes from Trunk.
Refs #6795.
Refs #6394.

[SVN r79562]
2012-07-16 10:03:17 +00:00
7f7a6d2324 Merge changes from trunk:
Fix PDF install rule so that it's explicit and automatically invokes a PDF build when specified on the command line.
So "bjam pdfinstall" will now build and install the PDF to the current directory.
This works around some problems that the previous versions had if the user did not have an FO processor installed (basically Daniel James was unable to build the HTML docs for the distribution if the pdfinstall rule was implicit).


[SVN r79500]
2012-07-14 16:05:50 +00:00
e386b1acbe Fix PDF install rule so that it's explicit and automatically invokes a PDF build when specified on the command line.
So "bjam pdfinstall" will now build and install the PDF to the current directory.
This works around some problems that the previous versions had if the user did not have an FO processor installed (basically Daniel James was unable to build the HTML docs for the distribution if the pdfinstall rule was implicit).

[SVN r79492]
2012-07-14 11:21:03 +00:00
3656db0215 Fix typo. Regenerate docs.
Fixes #6795.

[SVN r79458]
2012-07-12 17:55:05 +00:00
7f7f8a30d0 Add strongly typed enum test.
[SVN r79457]
2012-07-12 17:21:53 +00:00
9903a5539d Restrict gcc pragma to gcc-4.0 and later.
[SVN r79286]
2012-07-05 15:46:18 +00:00
bff7255740 Merge Clang fixes from Trunk.
[SVN r78574]
2012-05-24 09:42:23 +00:00
960c85dedc Explicitly guard gcc's code path using BOOST_CLANG.
Currently, the version check `(__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)` is enough to guard gcc's code path from clang, since clang pretends to be gcc-4.2.1.
But, it seems that the clang's (pretended) gcc version will be changed to a more recent one in the near future. So we need the explicit guard.

[SVN r78448]
2012-05-13 05:49:12 +00:00
888910b677 forgot some change in the previous commit
[SVN r78345]
2012-05-06 03:04:35 +00:00
1cfb87e358 Unconditionally disable clang's __is_pod and __is_empty intrinsics when used with libstdc++ 4.2. This fixes an include order issue reported by Luc Bourhis.
Added `#include <cstddef>` to pull the stdlib's version macro, as done in boost/config/select_stdlib_config.hpp.

[SVN r78344]
2012-05-06 02:50:13 +00:00
d4290a588f Apply Clang patch from Michel Morin.
[SVN r77146]
2012-03-01 11:27:18 +00:00
269d7452b1 Merge type_traits changes from Trunk.
[SVN r76338]
2012-01-07 17:18:00 +00:00
5e1995dcf8 Update to GCC support: support up to 128-byte alignments.
[SVN r76306]
2012-01-04 17:13:24 +00:00
f62a7094d5 operator type traits: merged trunk: documentation on the limitation to template classes
[SVN r75085]
2011-10-22 00:23:10 +00:00
e05726d61d operator type traits: added documentation on the limitation to template classes with operator definition that does not bind with all template arguments
[SVN r75084]
2011-10-21 23:42:44 +00:00
0cd9189357 operator traits: merged trunk->release (patch to make clang work)
[SVN r74930]
2011-10-12 19:41:11 +00:00
e41fd89f7e operator traits: own operator definition moved up to fix clang failures
[SVN r74924]
2011-10-12 05:14:48 +00:00
da123a1166 operator traits: uniform handling of warning removal
[SVN r74920]
2011-10-11 20:38:20 +00:00
171fad88b8 merged operator trait addition from trunk to branches/release
[SVN r74865]
2011-10-09 22:28:33 +00:00
c1072ec858 operator traits: added limitation about SFINAE in the doc
[SVN r74861]
2011-10-09 19:13:44 +00:00
5d84dee264 operator traits: added #include for operator traits in 'include all header' type_traits.hpp
[SVN r74860]
2011-10-09 18:51:44 +00:00
db5707d8c3 Add new traits classes to the index.
Regenerate docs.

[SVN r74842]
2011-10-09 11:05:29 +00:00
9e0c22f76a operator traits: deprecated operator++(bool) is now correctly handled (has_{pre,post}_increment<bool>::value==false
[SVN r74841]
2011-10-09 08:24:42 +00:00
e76b2462f1 Fix msvc warnings.
[SVN r74795]
2011-10-08 10:52:49 +00:00
6e2fae44d4 added type trait extension to operator detection
[SVN r74782]
2011-10-07 21:05:54 +00:00
360373e3ee eliminated unit_test_framework and BOOST_MESSAGE
[SVN r74734]
2011-10-05 10:05:30 +00:00
33db0b59ed Merge minor type traits fixes from Trunk.
[SVN r74575]
2011-09-26 12:19:40 +00:00
204f156c3b Fix doc typo.
Fixes #5942.

[SVN r74571]
2011-09-26 10:59:26 +00:00
969238f5f6 Fix errors in is_union examples.
Fixes #5885.

[SVN r74336]
2011-09-10 16:58:00 +00:00
aabbd5c3c8 Apply final part of Michel Morin's Clang patch.
[SVN r74183]
2011-09-01 17:43:32 +00:00
39cf0ec129 Apply Michel Morin's Clang patch.
[SVN r74178]
2011-08-31 17:10:35 +00:00
5976893b1a Merge accumulated type_traits patches from Trunk.
Refs #5777.

[SVN r74005]
2011-08-22 17:22:32 +00:00
5cc1ceccd1 Fix typo in code.
Fixes #5777.

[SVN r73954]
2011-08-20 16:05:02 +00:00
6842d7346b Documentation tweaks.
Fixes #5666.

[SVN r73942]
2011-08-20 09:02:55 +00:00
437c57d614 Fixes #5707. Fixes some trivial bugs for VC++6
[SVN r73201]
2011-07-17 19:36:06 +00:00
ea26a60081 Update docs to use latest auto-index in Trunk.
[SVN r72975]
2011-07-08 17:51:46 +00:00
2799200d4e Revert Clang intrinsics support - it doesn't always work presently.
Change authorized by eric niebler.
Fixes #5635.

[SVN r72758]
2011-06-26 08:16:55 +00:00
8ac524debe Revert support for clang 3.0 intrinsics in type traits.
As dicussed in:

http://lists.boost.org/Archives/boost/2011/06/182844.php


[SVN r72725]
2011-06-23 19:07:45 +00:00
5eb0486699 Merge from trunk.
[SVN r72423]
2011-06-05 19:13:25 +00:00
0bd2b25d5b Clang 3.0+ supports gcc-style type trait intrinsics.
[SVN r72280]
2011-05-30 12:42:20 +00:00
0e4093146b Fix flags for type_with_alignment test on gcc-4.4 (won't compile due to
uninitialized warning).



[SVN r72279]
2011-05-30 12:41:33 +00:00
e1a315e00e Merge change from Trunk to release.
[SVN r71481]
2011-04-25 12:26:48 +00:00
8375014c95 Disable some embedded win32 warnings.
[SVN r71394]
2011-04-20 16:22:29 +00:00
7fdc037def Fix remove pointer so it works for cv-qualified function pointers in VC-10 (compiler bug workaround).
Fixes #5484.

[SVN r71378]
2011-04-19 11:03:17 +00:00
74d5955a7a Fix misc typos and regenerate docs.
Fixes #5457.
Fixes #5458.
Fixes #5459.
Fixes #5460.
Fixes #5461.

[SVN r71222]
2011-04-13 11:02:44 +00:00
0e0c39c08a Fixes for MSVC compilers confused with namespace issues.
[SVN r70662]
2011-03-28 09:03:39 +00:00
28631034ca Fix up type_traits intrinsic support when using the Intel compiler.
Suppress quite a few Intel-12.0 warnings.

[SVN r70221]
2011-03-20 12:18:59 +00:00
4f873ea632 Don't test msvc bug case for versions of msvc that don't support the fix.
[SVN r70203]
2011-03-19 18:03:57 +00:00
087d133793 Update type_traits tests to reflect C++0x.
Make better/simpler use of C++0x intrinsics where available.
Change a few traits to C++0x behaviour.
Update docs to reflect current intrinsic availability.

[SVN r70057]
2011-03-17 13:12:44 +00:00
ee29b7660f Change is_convertible to use C++0x behaviour where possible.
Change is_converible to use MSVC __is_convertible intrinsic.
Fixes #5271.
Fixes #4530.

[SVN r69822]
2011-03-10 16:52:00 +00:00
104afb9ba4 Fix PDF build from within boost-root/doc/pdf.
[SVN r69512]
2011-03-03 11:23:57 +00:00
5c40f50432 Fix non-ASCII character.
Fixes #5099.

[SVN r68691]
2011-02-07 16:39:33 +00:00
6b8890aec8 Fix PDF name and PDF index generation.
[SVN r68284]
2011-01-19 12:49:55 +00:00
902217df24 Don't try and redefine macros that are already set.
[SVN r68095]
2011-01-13 12:14:56 +00:00
c02516b25b Fix comon_type to actually work when typeof isn't in use.
Applies fixes from Vicente Botet.

[SVN r68040]
2011-01-12 13:29:37 +00:00
459e0bb6a0 Document the restrictions on is_virtual_base_of.
Refs #3730.

[SVN r67913]
2011-01-10 13:23:51 +00:00
a865f64c2f Document the restrictions on is_virtual_base_of.
Refs #3730.

[SVN r67912]
2011-01-10 13:17:45 +00:00
19b82cc55b Fix inspection report issues.
[SVN r67728]
2011-01-06 17:09:17 +00:00
630 changed files with 43208 additions and 9161 deletions

View File

@ -4,28 +4,11 @@
# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
import modules ;
path-constant here : . ;
if --enable-index in [ modules.peek : ARGV ]
{
ECHO "Building the type_traits docs with automatic index generation enabled." ;
using auto-index ;
project : requirements
<auto-index>on <format>pdf:<auto-index-internal>off
<format>html:<auto-index-internal>on
<auto-index-script>$(here)/index.idx
<auto-index-prefix>$(here)/../../..
<quickbook-define>enable_index ;
}
else
{
ECHO "Building the type_traits docs with automatic index generation disabled. Try building with --enable-index." ;
}
using quickbook ;
using auto-index ;
path-constant boost-images : ../../../doc/src/images ;
path-constant here : . ;
xml type_traits : type_traits.qbk ;
boostbook standalone
@ -76,13 +59,18 @@ boostbook standalone
<format>pdf:<xsl:param>admon.graphics.extension=".svg"
<format>pdf:<xsl:param>admon.graphics.path=$(boost-images)/
<format>pdf:<xsl:param>boost.url.prefix=http://www.boost.org/doc/libs/release/libs/type_traits/doc/html
<format>pdf:<auto-index-internal>off
<format>html:<auto-index-internal>on
<auto-index-script>$(here)/index.idx
<auto-index-prefix>$(here)/../../..
<auto-index>on
;
#install html : ../../../doc/html/boostbook.css ;
#install ../ : ../../../boost.png ;
install pdfinstall : standalone/<format>pdf : <install-type>PDF <location>. <name>type_traits.pdf ;
explicit pdfinstall ;
###############################################################################
alias boostdoc ;
explicit boostdoc ;
alias boostrelease : standalone ;
explicit boostrelease ;

View File

@ -17,10 +17,6 @@ __type The same type as `T const` for all `T`.
__std_ref 3.9.3.
__compat If the compiler does not support partial specialization of class-templates
then this template will compile, but the member `type` will always be the same as
type `T` except where __transform_workaround have been applied.
__header ` #include <boost/type_traits/add_const.hpp>` or ` #include <boost/type_traits.hpp>`
[table Examples
@ -37,5 +33,7 @@ __header ` #include <boost/type_traits/add_const.hpp>` or ` #include <boost/type
]
[all_compilers]
[endsect]

View File

@ -17,10 +17,6 @@ __type The same type as `T const volatile` for all `T`.
__std_ref 3.9.3.
__compat If the compiler does not support partial specialization of class-templates
then this template will compile, but the member `type` will always be the same as
type `T` except where __transform_workaround have been applied.
__header ` #include <boost/type_traits/add_cv.hpp>` or ` #include <boost/type_traits.hpp>`
[table Examples
@ -37,5 +33,7 @@ __header ` #include <boost/type_traits/add_cv.hpp>` or ` #include <boost/type_tr
]
[all_compilers]
[endsect]

View File

@ -19,10 +19,6 @@ the member typedef type shall name `U&`; otherwise, type shall name `T`.
__std_ref 20.7.6.2.
__compat If the compiler does not support partial specialization of class-templates
then this template will compile, but the member `type` will always be the same as
type `T` except where __transform_workaround have been applied.
__header ` #include <boost/type_traits/add_lvalue_reference.hpp>` or ` #include <boost/type_traits.hpp>`
[table Examples
@ -43,5 +39,7 @@ __header ` #include <boost/type_traits/add_lvalue_reference.hpp>` or ` #include
]
[all_compilers]
[endsect]

View File

@ -16,15 +16,11 @@
__type The same type as `remove_reference<T>::type*`.
The rationale for this template
is that it produces the same type as `TYPEOF(&t)`,
is that it produces the same type as `decltype(&t)`,
where `t` is an object of type `T`.
__std_ref 8.3.1.
__compat If the compiler does not support partial specialization of class-templates
then this template will compile, but the member `type` will always be the same as
type `T` except where __transform_workaround have been applied.
__header ` #include <boost/type_traits/add_pointer.hpp>` or ` #include <boost/type_traits.hpp>`
[table Examples
@ -41,5 +37,7 @@ __header ` #include <boost/type_traits/add_pointer.hpp>` or ` #include <boost/ty
]
[all_compilers]
[endsect]

View File

@ -23,10 +23,6 @@ __type If `T` is not a reference type then `T&`, otherwise `T`.
__std_ref 8.3.2.
__compat If the compiler does not support partial specialization of class-templates
then this template will compile, but the member `type` will always be the same as
type `T` except where __transform_workaround have been applied.
__header ` #include <boost/type_traits/add_reference.hpp>` or ` #include <boost/type_traits.hpp>`
[table Examples
@ -43,5 +39,7 @@ __header ` #include <boost/type_traits/add_reference.hpp>` or ` #include <boost/
]
[all_compilers]
[endsect]

View File

@ -21,11 +21,6 @@ reference. -end note\]].
__std_ref 20.7.6.2.
__compat If the compiler does not support partial specialization of class-templates
and rvalue references
then this template will compile, but the member `type` will always be the same as
type `T`.
__header ` #include <boost/type_traits/add_rvalue_reference.hpp>` or ` #include <boost/type_traits.hpp>`
[table Examples
@ -46,5 +41,7 @@ __header ` #include <boost/type_traits/add_rvalue_reference.hpp>` or ` #include
]
__compat In the absence of rvalue-reference support this trait has no effect.
[endsect]

View File

@ -17,10 +17,6 @@ __type The same type as `T volatile` for all `T`.
__std_ref 3.9.3.
__compat If the compiler does not support partial specialization of class-templates
then this template will compile, but the member `type` will always be the same as
type `T` except where __transform_workaround have been applied.
__header ` #include <boost/type_traits/add_volatile.hpp>` or ` #include <boost/type_traits.hpp>`
[table Examples
@ -37,5 +33,7 @@ __header ` #include <boost/type_traits/add_volatile.hpp>` or ` #include <boost/t
]
[all_compilers]
[endsect]

View File

@ -18,5 +18,37 @@ that is a multiple of `Align`.
__header ` #include <boost/type_traits/aligned_storage.hpp>` or ` #include <boost/type_traits.hpp>`
On the GCC and Visual C++ compilers (or compilers that are compatible with them), we support
requests for types with alignments greater than any built in type (up to 128-bit alignment).
Visual C++ users should note that such "extended" types can not be passed down the stack as
by-value function arguments.
[important
Visual C++ users should be aware that MSVC has an elastic definition of alignment, for
example consider the following code:
``
typedef boost::aligned_storage<8,8>::type align_t;
assert(boost::alignment_of<align_t>::value % 8 == 0);
align_t a;
assert(((std::uintptr_t)&a % 8) == 0);
char c = 0;
align_t a1;
assert(((std::uintptr_t)&a1 % 8) == 0);
``
In this code the final assert will fail for a 32-bit build because variable `a1` is not
aligned on an 8-byte boundary. Had we used the MSVC intrinsic `__alignof` in
place of `alignment_of` or `std::aligned_storage` in place of `boost::aligned_storage`
the result would have been no different. In MSVC alignment requirements/promises only
really apply to variables on the heap, not on the stack.
Further, although MSVC has a mechanism for generating new types with arbitrary alignment
requirements, such types cannot be passed as function arguments on the program stack.
Therefore had `boost::aligned_storage<8,8>::type` been a type declared with
`__declspec(align(8))` we would break a great deal of existing code that relies on
being able to pass such types through the program stack.
]
[endsect]

View File

@ -30,5 +30,26 @@ expression with value `ALIGNOF(double)`.]
[:`alignment_of<T>::value_type` is the type `std::size_t`.]
[important
Visual C++ users should note that MSVC has varying definitions of "alignment".
For example consider the following code:
``
typedef long long align_t;
assert(boost::alignment_of<align_t>::value % 8 == 0);
align_t a;
assert(((std::uintptr_t)&a % 8) == 0);
char c = 0;
align_t a1;
assert(((std::uintptr_t)&a1 % 8) == 0);
``
In this code, even though `boost::alignment_of<align_t>` reports that `align_t` has 8-byte
alignment, the final assert will fail for a 32-bit build because `a1` is not aligned on an
8 byte boundary. Note that had we used the MSVC intrinsic `__alignof` in place of `boost::alignment_of`
we would still get the same result. In fact for MSVC alignment requirements (and promises) only really
apply to dynamic storage, and not the stack.
]
[endsect]

View File

@ -11,83 +11,73 @@
[section:common_type common_type]
[/===================================================================]
[def __declval [@../../../utility/doc/html/declval.html declval]]
`#include <boost/type_traits/common_type.hpp>`
__header ` #include <boost/type_traits/common_type.hpp>` or ` #include <boost/type_traits.hpp>`
namespace boost {
template <class ...T> struct __common_type;
template <class... T> struct common_type;
}
__common_type is a traits class used to deduce a type common to a several types, useful as the return type of functions
`common_type` is a traits class used to deduce a type common to a several types, useful as the return type of functions
operating on multiple input types such as in mixed-mode arithmetic..
The nested typedef `::type` could be defined as follows:
template <class ...T>
template <class... T>
struct common_type;
template <class T, class U, class ...V>
struct common_type<T,U,...V> {
typedef typename __common_type<typename __common_type<T, U>::type, V...>::type type;
template <class T, class U, class... V>
struct common_type<T, U, V...> {
typedef typename common_type<typename common_type<T, U>::type, V...>::type type;
};
template <>
struct common_type<> {
};
template <class T>
struct common_type<T> {
typedef T type;
typedef typename __decay<T>::type type;
};
template <class T, class U>
struct common_type<T, U> {
typedef decltype(__declval<bool>() ? __declval<T>() : __declval<U>()) type;
typedef typename __decay<
decltype( __declval<bool>()?
__declval<typename __decay<T>::type>():
__declval<typename __decay<U>::type>() )
>::type type;
};
All parameter types must be complete. This trait is permitted to be specialized by a user if at least one
template parameter is a user-defined type. [*Note:] Such specializations are required when only explicit conversions
are desired among the __common_type arguments.
are desired among the `common_type` arguments.
Note that when the compiler does not support variadic templates (and the macro BOOST_NO_VARIADIC_TEMPLATES is defined)
then the maximum number of template arguments is 3.
Note that when the compiler does not support variadic templates (and the macro `BOOST_NO_CXX11_VARIADIC_TEMPLATES` is defined)
then the maximum number of template arguments is 9.
[h4 Configuration macros]
When the compiler does not support static assertions then the user can select the way static assertions are reported. Define
* BOOST_COMMON_TYPE_USES_STATIC_ASSERT: define it if you want to use Boost.StaticAssert
* BOOST_COMMON_TYPE_USES_MPL_ASSERT: define it if you want to use Boost.MPL static asertions
The default behavior is to use mpl assertions in this case, but setting BOOST_COMMON_TYPE_USES_STATIC_ASSERT may reduce
compile times and header dependencies somewhat.
Depending on the static assertion used you will have an hint of the failing assertion either through the symbol or through the text.
When possible common_type is implemented using `decltype`. Otherwise when BOOST_COMMON_TYPE_DONT_USE_TYPEOF is not defined
it uses Boost.TypeOf.
[h4 Tutorial]
In a nutshell, __common_type is a trait that takes 1 or more types, and returns a type which
In a nutshell, `common_type` is a trait that takes 1 or more types, and returns a type which
all of the types will convert to. The default definition demands this conversion be implicit.
However the trait can be specialized for user-defined types which want to limit their inter-type conversions to explicit,
and yet still want to interoperate with the __common_type facility.
and yet still want to interoperate with the `common_type` facility.
[*Example:]
template <class T, class U>
complex<typename __common_type<T, U>::type>
complex<typename common_type<T, U>::type>
operator+(complex<T>, complex<U>);
In the above example, "mixed-mode" complex arithmetic is allowed. The return type is described by __common_type.
In the above example, "mixed-mode" complex arithmetic is allowed. The return type is described by `common_type`.
For example the resulting type of adding a `complex<float>` and `complex<double>` might be a `complex<double>`.
Here is how someone might produce a variadic comparison function:
template <class ...T>
typename __common_type<T...>::type
typename common_type<T...>::type
min(T... t);
This is a very useful and broadly applicable utility.
@ -97,17 +87,17 @@ This is a very useful and broadly applicable utility.
Another choice for the author of the preceding operator could be
template <class T, class U>
typename __common_type<complex<T>, complex<U> >::type
typename common_type<complex<T>, complex<U> >::type
operator+(complex<T>, complex<U>);
As the default definition of __common_type demands the conversion be implicit, we need to specialize the trait for complex types as follows.
As the default definition of `common_type` demands the conversion be implicit, we need to specialize the trait for complex types as follows.
template <class T, class U>
struct __common_type<complex<T>, complex<U> > {
typedef complex< __common_type<T, U> > type;
struct common_type<complex<T>, complex<U> > {
typedef complex< common_type<T, U> > type;
};
[h4 How important is the order of the common_type<> template arguments?]
[h4 How important is the order of the `common_type<>` template arguments?]
The order of the template parameters is important.
@ -164,7 +154,7 @@ Clients wanting to ask `common_type<A, B, C>` in any order and get the same resu
This is needed as the specialization of `common_type<A, B>` is not be used implicitly for `common_type<B, A>`.
[h4 Can the common_type of two types be a third type?]
[h4 Can the `common_type` of two types be a third type?]
Given the preceding example, one might expect `common_type<A,B>::type` to be `C` without any intervention from the user.
But the default `common_type<>` implementation doesn't grant that. It is intended that clients who wish for `common_type<A, B>`
@ -183,7 +173,7 @@ to be well defined to define it themselves:
Now this client can ask for `common_type<A, B>`.
[h4 How common_type behaves with pointers?]
[h4 How does `common_type` behave with pointers?]
Consider
@ -209,17 +199,17 @@ But in the absence of a motivating use cases, we prefer not to add more than the
Of course the user can always make this specialization.
[h4 Can you explain the pros/cons of common_type against Boost.Typeof?]
[h4 Can you explain the pros/cons of `common_type` against Boost.Typeof?]
Even if they appear to be close, `__common_type` and `typeof` have
Even if they appear to be close, `common_type` and `typeof` have
different purposes. You use `typeof` to get the type of an expression, while
you use __common_type to set explicitly the type returned of a template
function. Both are complementary, and indeed __common_type is equivalent to
`decltype(__declval<bool>() ? __declval<T>() : __declval<U>())`
you use `common_type` to set explicitly the type returned of a template
function. Both are complementary, and indeed `common_type` is approximately equivalent to
`decltype(__declval<bool>() ? __declval<T>() : __declval<U>())`.
__common_type is also similar to promote_args<class ...T> in boost/math/tools/promotion.hpp,
though it is not exactly the same as promote_args either. __common_type<T1, T2>::type simply represents the result of some
operation on T1 and T2, and defaults to the type obtained by putting T1 and T2 into a conditional statement.
`common_type` is also similar to `promote_args<class ...T>` in `boost/math/tools/promotion.hpp`,
though it is not exactly the same as `promote_args` either. `common_type<T1, T2>::type` simply represents the result of some
operation on `T1` and `T2`, and defaults to the type obtained by putting `T1` and `T2` into a conditional statement.
It is meant to be customizable (via specialization) if this default is not appropriate.

View File

@ -10,15 +10,13 @@
[/===================================================================]
`#include <boost/type_traits/conditional.hpp>`
__header ` #include <boost/type_traits/conditional.hpp>` or ` #include <boost/type_traits.hpp>`
namespace boost {
template <bool B, class T, class U> struct __conditional;
}
If B is true, the member typedef type shall equal T. If B is false, the member typedef type shall equal F.
This trait is really just an alias for `boost::mpl::if_c`.
If B is true, the member typedef type shall equal T. If B is false, the member typedef type shall equal U.
[endsect]

39
doc/copy_cv.qbk Normal file
View File

@ -0,0 +1,39 @@
[/
Copyright 2015 Peter Dimov.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:copy_cv copy_cv]
template <class T, class U>
struct copy_cv
{
typedef __below type;
};
__type [^T /cv/], where /cv/ are the cv-qualifiers of `U`.
__header ` #include <boost/type_traits/copy_cv.hpp>` or ` #include <boost/type_traits.hpp>`
[table Examples
[ [Expression] [Result Type]]
[[`copy_cv<int, void>::type`][`int`]]
[[`copy_cv<int const, void>::type`][`int const`]]
[[`copy_cv<int, void const>::type`][`int const`]]
[[`copy_cv<int volatile, void const>::type`][`int const volatile`]]
[[`copy_cv<int&, void const>::type`] [`int&`]]
[[`copy_cv<int*, void volatile>::type`] [`int* volatile`]]
]
[endsect]

View File

@ -18,7 +18,8 @@ current maintainer of the library.
This version of type traits library is based on contributions by
Adobe Systems Inc, David Abrahams, Steve Cleary,
Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat Marcus,
Itay Maman, John Maddock, Thorsten Ottosen, Robert Ramey and Jeremy Siek.
Itay Maman, John Maddock, Thorsten Ottosen, Robert Ramey, Jeremy Siek
and Antony Polukhin.
Mat Marcus and Jesse Jones invented, and
[@http://opensource.adobe.com/project4/project.shtml published a paper describing],

View File

@ -31,10 +31,12 @@ __header ` #include <boost/type_traits/decay.hpp>` or ` #include <boost/type_tra
[[`decay<int(&)(double)>::type`] [`int(*)(double)`]]
[[`int(*)(double`] [`int(*)(double)`]]
[[`int(*)(double)`] [`int(*)(double)`]]
[[`int(double)`] [`int(*)(double)`]]
]
[all_compilers]
[endsect]

21
doc/declval.qbk Normal file
View File

@ -0,0 +1,21 @@
[/
Copyright 2015 Peter Dimov.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:declval declval]
template <class T>
typename add_rvalue_reference<T>::type declval() noexcept; // as unevaluated operand
__std_ref C++11 20.2.4 [declval].
__header ` #include <boost/type_traits/declval.hpp>` or ` #include <boost/type_traits.hpp>`
The function template `declval` is used when a value of a certain type is required in
a type computation context. For example, the type of the result of adding an `int` and
a `float` can be obtained with the expression `decltype( declval<int>() + declval<float>() )`.
[endsect]

View File

@ -146,18 +146,18 @@ determine whether to destructors need to be called
[section:iter An improved Version of std::iter_swap]
Demonstrates a version of `std::iter_swap` that use type traits to
determine whether an it's arguments are proxying iterators or not,
determine whether an it's arguments are proxy iterators or not,
if they're not then it just does a `std::swap` of it's dereferenced
arguments (the
same as `std::iter_swap` does), however if they are proxying iterators
same as `std::iter_swap` does), however if they are proxy iterators
then takes special care over the swap to ensure that the algorithm
works correctly for both proxying iterators, and even iterators of
works correctly for both proxy iterators, and even iterators of
different types
(see [@../../examples/iter_swap_example.cpp iter_swap_example.cpp]):
//
// iter_swap:
// tests whether iterator is a proxying iterator or not, and
// tests whether iterator is a proxy iterator or not, and
// uses optimal form accordingly:
//
namespace detail{
@ -221,7 +221,7 @@ and enum types to double:
An improved `std::min` function could be written like this:
template <class T, class U>
typename __common_type<T, U>::type min(T t, T u)
typename __common_type<T, U>::type min(T t, U u)
{
return t < u ? t : u;
}

View File

@ -25,7 +25,7 @@ __examples
[:`extent<double[2][3][4], 1>::type` is the type `__integral_constant<std::size_t, 3>`.]
[:`extent<double[2][3][4], 3>::type` is the type `__integral_constant<std::size_t, 4>`.]
[:`extent<double[2][3][4], 2>::type` is the type `__integral_constant<std::size_t, 4>`.]
[:`extent<int[4]>::value` is an integral constant
expression that evaluates to /4/.]
@ -44,5 +44,7 @@ expression that evaluates to /0/: `boost::array` is a class type and [*not an ar
[:`extent<T>::value_type` is the type `std::size_t`.]
[all_compilers]
[endsect]

View File

@ -33,5 +33,7 @@ __header ` #include <boost/type_traits/floating_point_promotion.hpp>` or ` #incl
]
[all_compilers]
[endsect]

View File

@ -52,5 +52,7 @@ type use __remove_pointer.]
]
[all_compilers]
[endsect]

107
doc/has_bit_and.qbk Normal file
View File

@ -0,0 +1,107 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_bit_and has_bit_and]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_bit_and : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs&rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs&rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator&`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs&rhs); // is valid if has_bit_and<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_bit_and.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
__examples
[:`has_bit_and<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_bit_and<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_bit_and<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_bit_and<long>` inherits from `__true_type`.]
[:`has_bit_and<int, int, int>` inherits from `__true_type`.]
[:`has_bit_and<const int, int>` inherits from `__true_type`.]
[:`has_bit_and<int, double, bool>` inherits from `__false_type`.]
[:`has_bit_and<int, int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[has_binary_operator_compat]
[*Known issues:]
* This trait cannot detect whether binary `operator&` is public or not:
if `operator&` is defined as a private member of `Lhs` then
instantiating `has_bit_and<Lhs>` will produce a compiler error.
For this reason `has_bit_and` cannot be used to determine whether a type has a public `operator&` or not.
``
struct A { private: void operator&(const A&); };
boost::has_bit_and<A>::value; // error: A::operator&(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator&(const A&, const A&);
struct B { operator A(); };
boost::has_bit_and<A>::value; // this is fine
boost::has_bit_and<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator&` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_bit_and.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator&(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_bit_and< contains< good > >::value<<'\n'; // true
contains<good> g;
g&g; // ok
// does not work for contains<bad>
std::cout<<boost::has_bit_and< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b&b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

107
doc/has_bit_and_assign.qbk Normal file
View File

@ -0,0 +1,107 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_bit_and_assign has_bit_and_assign]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_bit_and_assign : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs&=rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs&=rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator&=`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs&=rhs); // is valid if has_bit_and_assign<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_bit_and_assign.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_bit_and_assign<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_bit_and_assign<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_bit_and_assign<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_bit_and_assign<long>` inherits from `__true_type`.]
[:`has_bit_and_assign<int, int, int>` inherits from `__true_type`.]
[:`has_bit_and_assign<const int, int>` inherits from `__false_type`.]
[:`has_bit_and_assign<int, double, bool>` inherits from `__false_type`.]
[:`has_bit_and_assign<int, int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator&=` is public or not:
if `operator&=` is defined as a private member of `Lhs` then
instantiating `has_bit_and_assign<Lhs>` will produce a compiler error.
For this reason `has_bit_and_assign` cannot be used to determine whether a type has a public `operator&=` or not.
``
struct A { private: void operator&=(const A&); };
boost::has_bit_and_assign<A>::value; // error: A::operator&=(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator&=(const A&, const A&);
struct B { operator A(); };
boost::has_bit_and_assign<A>::value; // this is fine
boost::has_bit_and_assign<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator&=` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_bit_and_assign.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator&=(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_bit_and_assign< contains< good > >::value<<'\n'; // true
contains<good> g;
g&=g; // ok
// does not work for contains<bad>
std::cout<<boost::has_bit_and_assign< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b&=b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

107
doc/has_bit_or.qbk Normal file
View File

@ -0,0 +1,107 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_bit_or has_bit_or]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_bit_or : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs|rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs|rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator|`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs|rhs); // is valid if has_bit_or<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_bit_or.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_bit_or<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_bit_or<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_bit_or<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_bit_or<long>` inherits from `__true_type`.]
[:`has_bit_or<int, int, int>` inherits from `__true_type`.]
[:`has_bit_or<const int, int>` inherits from `__true_type`.]
[:`has_bit_or<int, double, bool>` inherits from `__false_type`.]
[:`has_bit_or<int, int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator|` is public or not:
if `operator|` is defined as a private member of `Lhs` then
instantiating `has_bit_or<Lhs>` will produce a compiler error.
For this reason `has_bit_or` cannot be used to determine whether a type has a public `operator|` or not.
``
struct A { private: void operator|(const A&); };
boost::has_bit_or<A>::value; // error: A::operator|(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator|(const A&, const A&);
struct B { operator A(); };
boost::has_bit_or<A>::value; // this is fine
boost::has_bit_or<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator|` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_bit_or.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator|(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_bit_or< contains< good > >::value<<'\n'; // true
contains<good> g;
g|g; // ok
// does not work for contains<bad>
std::cout<<boost::has_bit_or< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b|b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

107
doc/has_bit_or_assign.qbk Normal file
View File

@ -0,0 +1,107 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_bit_or_assign has_bit_or_assign]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_bit_or_assign : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs|=rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs|=rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator|=`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs|=rhs); // is valid if has_bit_or_assign<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_bit_or_assign.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_bit_or_assign<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_bit_or_assign<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_bit_or_assign<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_bit_or_assign<long>` inherits from `__true_type`.]
[:`has_bit_or_assign<int, int, int>` inherits from `__true_type`.]
[:`has_bit_or_assign<const int, int>` inherits from `__false_type`.]
[:`has_bit_or_assign<int, double, bool>` inherits from `__false_type`.]
[:`has_bit_or_assign<int, int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator|=` is public or not:
if `operator|=` is defined as a private member of `Lhs` then
instantiating `has_bit_or_assign<Lhs>` will produce a compiler error.
For this reason `has_bit_or_assign` cannot be used to determine whether a type has a public `operator|=` or not.
``
struct A { private: void operator|=(const A&); };
boost::has_bit_or_assign<A>::value; // error: A::operator|=(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator|=(const A&, const A&);
struct B { operator A(); };
boost::has_bit_or_assign<A>::value; // this is fine
boost::has_bit_or_assign<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator|=` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_bit_or_assign.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator|=(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_bit_or_assign< contains< good > >::value<<'\n'; // true
contains<good> g;
g|=g; // ok
// does not work for contains<bad>
std::cout<<boost::has_bit_or_assign< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b|=b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

107
doc/has_bit_xor.qbk Normal file
View File

@ -0,0 +1,107 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_bit_xor has_bit_xor]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_bit_xor : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs^rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs^rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator^`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs^rhs); // is valid if has_bit_xor<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_bit_xor.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_bit_xor<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_bit_xor<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_bit_xor<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_bit_xor<long>` inherits from `__true_type`.]
[:`has_bit_xor<int, int, int>` inherits from `__true_type`.]
[:`has_bit_xor<const int, int>` inherits from `__true_type`.]
[:`has_bit_xor<int, double, bool>` inherits from `__false_type`.]
[:`has_bit_xor<int, int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator^` is public or not:
if `operator^` is defined as a private member of `Lhs` then
instantiating `has_bit_xor<Lhs>` will produce a compiler error.
For this reason `has_bit_xor` cannot be used to determine whether a type has a public `operator^` or not.
``
struct A { private: void operator^(const A&); };
boost::has_bit_xor<A>::value; // error: A::operator^(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator^(const A&, const A&);
struct B { operator A(); };
boost::has_bit_xor<A>::value; // this is fine
boost::has_bit_xor<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator^` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_bit_xor.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator^(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_bit_xor< contains< good > >::value<<'\n'; // true
contains<good> g;
g^g; // ok
// does not work for contains<bad>
std::cout<<boost::has_bit_xor< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b^b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

107
doc/has_bit_xor_assign.qbk Normal file
View File

@ -0,0 +1,107 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_bit_xor_assign has_bit_xor_assign]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_bit_xor_assign : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs^=rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs^=rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator^=`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs^=rhs); // is valid if has_bit_xor_assign<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_bit_xor_assign.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_bit_xor_assign<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_bit_xor_assign<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_bit_xor_assign<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_bit_xor_assign<long>` inherits from `__true_type`.]
[:`has_bit_xor_assign<int, int, int>` inherits from `__true_type`.]
[:`has_bit_xor_assign<const int, int>` inherits from `__false_type`.]
[:`has_bit_xor_assign<int, double, bool>` inherits from `__false_type`.]
[:`has_bit_xor_assign<int, int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator^=` is public or not:
if `operator^=` is defined as a private member of `Lhs` then
instantiating `has_bit_xor_assign<Lhs>` will produce a compiler error.
For this reason `has_bit_xor_assign` cannot be used to determine whether a type has a public `operator^=` or not.
``
struct A { private: void operator^=(const A&); };
boost::has_bit_xor_assign<A>::value; // error: A::operator^=(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator^=(const A&, const A&);
struct B { operator A(); };
boost::has_bit_xor_assign<A>::value; // this is fine
boost::has_bit_xor_assign<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator^=` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_bit_xor_assign.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator^=(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_bit_xor_assign< contains< good > >::value<<'\n'; // true
contains<good> g;
g^=g; // ok
// does not work for contains<bad>
std::cout<<boost::has_bit_xor_assign< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b^=b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

109
doc/has_complement.qbk Normal file
View File

@ -0,0 +1,109 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_complement has_complement]
template <class Rhs, class Ret=dont_care>
struct has_complement : public __tof {};
__inherit
If (i) `rhs` of type `Rhs` can be used in expression `~rhs`,
and (ii) `Ret=dont_care` or the result of expression `~rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of prefix `operator~`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Rhs rhs;
f(~rhs); // is valid if has_complement<Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_complement.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_complement<Rhs, Ret>::value_type` is the type `bool`.]
[:`has_complement<Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_complement<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_complement<long>` inherits from `__true_type`.]
[:`has_complement<int, int>` inherits from `__true_type`.]
[:`has_complement<int, long>` inherits from `__true_type`.]
[:`has_complement<const int>` inherits from `__true_type`.]
[:`has_complement<int*>` inherits from `__false_type`.]
[:`has_complement<double, double>` inherits from `__false_type`.]
[:`has_complement<double, int>` inherits from `__false_type`.]
[:`has_complement<int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether prefix `operator~` is public or not:
if `operator~` is defined as a private member of `Rhs` then
instantiating `has_complement<Rhs>` will produce a compiler error.
For this reason `has_complement` cannot be used to determine whether a type has a public `operator~` or not.
``
struct A { private: void operator~(); };
boost::has_complement<A>::value; // error: A::operator~() is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator~(const A&);
struct B { operator A(); };
boost::has_complement<A>::value; // this is fine
boost::has_complement<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator~` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_complement.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator~(const contains<T> &rhs) {
return f(rhs.data);
}
class bad { };
class good { };
bool f(const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_complement< contains< good > >::value<<'\n'; // true
contains<good> g;
~g; // ok
// does not work for contains<bad>
std::cout<<boost::has_complement< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
~b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

112
doc/has_dereference.qbk Normal file
View File

@ -0,0 +1,112 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_dereference has_dereference]
template <class Rhs, class Ret=dont_care>
struct has_dereference : public __tof {};
__inherit
If (i) `rhs` of type `Rhs` can be used in expression `*rhs`,
and (ii) `Ret=dont_care` or the result of expression `*rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of prefix `operator*`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Rhs rhs;
f(*rhs); // is valid if has_dereference<Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_dereference.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_dereference<Rhs, Ret>::value_type` is the type `bool`.]
[:`has_dereference<Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_dereference<int*>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_dereference<long*>` inherits from `__true_type`.]
[:`has_dereference<int*, int>` inherits from `__true_type`.]
[:`has_dereference<int*, const int>` inherits from `__true_type`.]
[:`has_dereference<int const *>` inherits from `__true_type`.]
[:`has_dereference<int * const>` inherits from `__true_type`.]
[:`has_dereference<int const * const>` inherits from `__true_type`.]
[:`has_dereference<int>` inherits from `__false_type`.]
[:`has_dereference<double>` inherits from `__false_type`.]
[:`has_dereference<void*>` inherits from `__false_type`.]
[:`has_dereference<const int*, int&>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether prefix `operator*` is public or not:
if `operator*` is defined as a private member of `Rhs` then
instantiating `has_dereference<Rhs>` will produce a compiler error.
For this reason `has_dereference` cannot be used to determine whether a type has a public `operator*` or not.
``
struct A { private: void operator*(); };
boost::has_dereference<A>::value; // error: A::operator*() is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator*(const A&);
struct B { operator A(); };
boost::has_dereference<A>::value; // this is fine
boost::has_dereference<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator*` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_dereference.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator*(const contains<T> &rhs) {
return f(rhs.data);
}
class bad { };
class good { };
bool f(const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_dereference< contains< good > >::value<<'\n'; // true
contains<good> g;
*g; // ok
// does not work for contains<bad>
std::cout<<boost::has_dereference< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
*b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

109
doc/has_divides.qbk Normal file
View File

@ -0,0 +1,109 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_divides has_divides]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_divides : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs/rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs/rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator/`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs/rhs); // is valid if has_divides<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_divides.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_divides<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_divides<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_divides<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_divides<long>` inherits from `__true_type`.]
[:`has_divides<int, int, int>` inherits from `__true_type`.]
[:`has_divides<int, int, long>` inherits from `__true_type`.]
[:`has_divides<int, double, double>` inherits from `__true_type`.]
[:`has_divides<int, double, int>` inherits from `__true_type`.]
[:`has_divides<const int, int>::value` inherits from `__true_type`.]
[:`has_divides<int, int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator/` is public or not:
if `operator/` is defined as a private member of `Lhs` then
instantiating `has_divides<Lhs>` will produce a compiler error.
For this reason `has_divides` cannot be used to determine whether a type has a public `operator/` or not.
``
struct A { private: void operator/(const A&); };
boost::has_divides<A>::value; // error: A::operator/(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator/(const A&, const A&);
struct B { operator A(); };
boost::has_divides<A>::value; // this is fine
boost::has_divides<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator/` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_divides.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator/(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_divides< contains< good > >::value<<'\n'; // true
contains<good> g;
g/g; // ok
// does not work for contains<bad>
std::cout<<boost::has_divides< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b/b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

109
doc/has_divides_assign.qbk Normal file
View File

@ -0,0 +1,109 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_divides_assign has_divides_assign]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_divides_assign : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs/=rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs/=rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator/=`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs/=rhs); // is valid if has_divides_assign<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_divides_assign.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_divides_assign<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_divides_assign<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_divides_assign<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_divides_assign<long>` inherits from `__true_type`.]
[:`has_divides_assign<int, int, int>` inherits from `__true_type`.]
[:`has_divides_assign<int, int, long>` inherits from `__true_type`.]
[:`has_divides_assign<int, double, double>` inherits from `__true_type`.]
[:`has_divides_assign<int, double, int>` inherits from `__true_type`.]
[:`has_divides_assign<const int, int>::value` inherits from `__false_type`.]
[:`has_divides_assign<int, int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator/=` is public or not:
if `operator/=` is defined as a private member of `Lhs` then
instantiating `has_divides_assign<Lhs>` will produce a compiler error.
For this reason `has_divides_assign` cannot be used to determine whether a type has a public `operator/=` or not.
``
struct A { private: void operator/=(const A&); };
boost::has_divides_assign<A>::value; // error: A::operator/=(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator/=(const A&, const A&);
struct B { operator A(); };
boost::has_divides_assign<A>::value; // this is fine
boost::has_divides_assign<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator/=` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_divides_assign.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator/=(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_divides_assign< contains< good > >::value<<'\n'; // true
contains<good> g;
g/=g; // ok
// does not work for contains<bad>
std::cout<<boost::has_divides_assign< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b/=b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

109
doc/has_equal_to.qbk Normal file
View File

@ -0,0 +1,109 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_equal_to has_equal_to]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_equal_to : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs==rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs==rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator==`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs==rhs); // is valid if has_equal_to<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_equal_to.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_equal_to<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_equal_to<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_equal_to<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_equal_to<long>` inherits from `__true_type`.]
[:`has_equal_to<int, int, bool>` inherits from `__true_type`.]
[:`has_equal_to<int, double, bool>` inherits from `__true_type`.]
[:`has_equal_to<const int>` inherits from `__true_type`.]
[:`has_equal_to<int*, int>` inherits from `__false_type`.]
[:`has_equal_to<int*, double*>` inherits from `__false_type`.]
[:`has_equal_to<int, int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator==` is public or not:
if `operator==` is defined as a private member of `Lhs` then
instantiating `has_equal_to<Lhs>` will produce a compiler error.
For this reason `has_equal_to` cannot be used to determine whether a type has a public `operator==` or not.
``
struct A { private: void operator==(const A&); };
boost::has_equal_to<A>::value; // error: A::operator==(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator==(const A&, const A&);
struct B { operator A(); };
boost::has_equal_to<A>::value; // this is fine
boost::has_equal_to<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator==` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_equal_to.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator==(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_equal_to< contains< good > >::value<<'\n'; // true
contains<good> g;
g==g; // ok
// does not work for contains<bad>
std::cout<<boost::has_equal_to< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b==b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

109
doc/has_greater.qbk Normal file
View File

@ -0,0 +1,109 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_greater has_greater]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_greater : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs>rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs>rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator>`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs>rhs); // is valid if has_greater<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_greater.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_greater<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_greater<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_greater<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_greater<long>` inherits from `__true_type`.]
[:`has_greater<int, int, bool>` inherits from `__true_type`.]
[:`has_greater<int, double, bool>` inherits from `__true_type`.]
[:`has_greater<const int>` inherits from `__true_type`.]
[:`has_greater<int*, int>` inherits from `__false_type`.]
[:`has_greater<int*, double*>` inherits from `__false_type`.]
[:`has_greater<int, int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator>` is public or not:
if `operator>` is defined as a private member of `Lhs` then
instantiating `has_greater<Lhs>` will produce a compiler error.
For this reason `has_greater` cannot be used to determine whether a type has a public `operator>` or not.
``
struct A { private: void operator>(const A&); };
boost::has_greater<A>::value; // error: A::operator>(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator>(const A&, const A&);
struct B { operator A(); };
boost::has_greater<A>::value; // this is fine
boost::has_greater<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator>` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_greater.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator>(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_greater< contains< good > >::value<<'\n'; // true
contains<good> g;
g>g; // ok
// does not work for contains<bad>
std::cout<<boost::has_greater< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b>b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

109
doc/has_greater_equal.qbk Normal file
View File

@ -0,0 +1,109 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_greater_equal has_greater_equal]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_greater_equal : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs>=rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs>=rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator>=`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs>=rhs); // is valid if has_greater_equal<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_greater_equal.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_greater_equal<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_greater_equal<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_greater_equal<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_greater_equal<long>` inherits from `__true_type`.]
[:`has_greater_equal<int, int, bool>` inherits from `__true_type`.]
[:`has_greater_equal<int, double, bool>` inherits from `__true_type`.]
[:`has_greater_equal<const int>` inherits from `__true_type`.]
[:`has_greater_equal<int*, int>` inherits from `__false_type`.]
[:`has_greater_equal<int*, double*>` inherits from `__false_type`.]
[:`has_greater_equal<int, int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator>=` is public or not:
if `operator>=` is defined as a private member of `Lhs` then
instantiating `has_greater_equal<Lhs>` will produce a compiler error.
For this reason `has_greater_equal` cannot be used to determine whether a type has a public `operator>=` or not.
``
struct A { private: void operator>=(const A&); };
boost::has_greater_equal<A>::value; // error: A::operator>=(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator>=(const A&, const A&);
struct B { operator A(); };
boost::has_greater_equal<A>::value; // this is fine
boost::has_greater_equal<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator>=` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_greater_equal.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator>=(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_greater_equal< contains< good > >::value<<'\n'; // true
contains<good> g;
g>=g; // ok
// does not work for contains<bad>
std::cout<<boost::has_greater_equal< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b>=b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

110
doc/has_left_shift.qbk Normal file
View File

@ -0,0 +1,110 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_left_shift has_left_shift]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_left_shift : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs<<rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs<<rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator<<`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs<<rhs); // is valid if has_left_shift<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_left_shift.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_left_shift<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_left_shift<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_left_shift<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_left_shift<long>` inherits from `__true_type`.]
[:`has_left_shift<int, int, int>` inherits from `__true_type`.]
[:`has_left_shift<const int, int>` inherits from `__true_type`.]
[:`has_left_shift<std::ostream, int>` inherits from `__true_type`.]
[:`has_left_shift<std::ostream, char*, std::ostream>` inherits from `__true_type`.]
[:`has_left_shift<std::ostream, std::string>` inherits from `__true_type`.]
[:`has_left_shift<int, double, bool>` inherits from `__false_type`.]
[:`has_left_shift<int, int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator<<` is public or not:
if `operator<<` is defined as a private member of `Lhs` then
instantiating `has_left_shift<Lhs>` will produce a compiler error.
For this reason `has_left_shift` cannot be used to determine whether a type has a public `operator<<` or not.
``
struct A { private: void operator<<(const A&); };
boost::has_left_shift<A>::value; // error: A::operator<<(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator<<(const A&, const A&);
struct B { operator A(); };
boost::has_left_shift<A>::value; // this is fine
boost::has_left_shift<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator<<` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_left_shift.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator<<(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_left_shift< contains< good > >::value<<'\n'; // true
contains<good> g;
g<<g; // ok
// does not work for contains<bad>
std::cout<<boost::has_left_shift< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b<<b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

View File

@ -0,0 +1,107 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_left_shift_assign has_left_shift_assign]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_left_shift_assign : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs<<=rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs<<=rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator<<=`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs<<=rhs); // is valid if has_left_shift_assign<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_left_shift_assign.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_left_shift_assign<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_left_shift_assign<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_left_shift_assign<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_left_shift_assign<long>` inherits from `__true_type`.]
[:`has_left_shift_assign<int, int, int>` inherits from `__true_type`.]
[:`has_left_shift_assign<const int, int>` inherits from `__false_type`.]
[:`has_left_shift_assign<int, double, bool>` inherits from `__false_type`.]
[:`has_left_shift_assign<int, int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator<<=` is public or not:
if `operator<<=` is defined as a private member of `Lhs` then
instantiating `has_left_shift_assign<Lhs>` will produce a compiler error.
For this reason `has_left_shift_assign` cannot be used to determine whether a type has a public `operator<<=` or not.
``
struct A { private: void operator<<=(const A&); };
boost::has_left_shift_assign<A>::value; // error: A::operator<<=(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator<<=(const A&, const A&);
struct B { operator A(); };
boost::has_left_shift_assign<A>::value; // this is fine
boost::has_left_shift_assign<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator<<=` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_left_shift_assign.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator<<=(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_left_shift_assign< contains< good > >::value<<'\n'; // true
contains<good> g;
g<<=g; // ok
// does not work for contains<bad>
std::cout<<boost::has_left_shift_assign< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b<<=b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

109
doc/has_less.qbk Normal file
View File

@ -0,0 +1,109 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_less has_less]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_less : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs<rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs<rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator<`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs<rhs); // is valid if has_less<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_less.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_less<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_less<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_less<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_less<long>` inherits from `__true_type`.]
[:`has_less<int, int, bool>` inherits from `__true_type`.]
[:`has_less<int, double, bool>` inherits from `__true_type`.]
[:`has_less<const int>` inherits from `__true_type`.]
[:`has_less<int*, int>` inherits from `__false_type`.]
[:`has_less<int*, double*>` inherits from `__false_type`.]
[:`has_less<int, int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator<` is public or not:
if `operator<` is defined as a private member of `Lhs` then
instantiating `has_less<Lhs>` will produce a compiler error.
For this reason `has_less` cannot be used to determine whether a type has a public `operator<` or not.
``
struct A { private: void operator<(const A&); };
boost::has_less<A>::value; // error: A::operator<(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator<(const A&, const A&);
struct B { operator A(); };
boost::has_less<A>::value; // this is fine
boost::has_less<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator<` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_less.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator<(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_less< contains< good > >::value<<'\n'; // true
contains<good> g;
g<g; // ok
// does not work for contains<bad>
std::cout<<boost::has_less< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b<b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

109
doc/has_less_equal.qbk Normal file
View File

@ -0,0 +1,109 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_less_equal has_less_equal]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_less_equal : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs<=rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs<=rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator<=`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs<=rhs); // is valid if has_less_equal<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_less_equal.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_less_equal<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_less_equal<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_less_equal<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_less_equal<long>` inherits from `__true_type`.]
[:`has_less_equal<int, int, bool>` inherits from `__true_type`.]
[:`has_less_equal<int, double, bool>` inherits from `__true_type`.]
[:`has_less_equal<const int>` inherits from `__true_type`.]
[:`has_less_equal<int*, int>` inherits from `__false_type`.]
[:`has_less_equal<int*, double*>` inherits from `__false_type`.]
[:`has_less_equal<int, int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator<=` is public or not:
if `operator<=` is defined as a private member of `Lhs` then
instantiating `has_less_equal<Lhs>` will produce a compiler error.
For this reason `has_less_equal` cannot be used to determine whether a type has a public `operator<=` or not.
``
struct A { private: void operator<=(const A&); };
boost::has_less_equal<A>::value; // error: A::operator<=(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator<=(const A&, const A&);
struct B { operator A(); };
boost::has_less_equal<A>::value; // this is fine
boost::has_less_equal<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator<=` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_less_equal.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator<=(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_less_equal< contains< good > >::value<<'\n'; // true
contains<good> g;
g<=g; // ok
// does not work for contains<bad>
std::cout<<boost::has_less_equal< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b<=b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

108
doc/has_logical_and.qbk Normal file
View File

@ -0,0 +1,108 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_logical_and has_logical_and]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_logical_and : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs&&rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs&&rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator&&`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs&&rhs); // is valid if has_logical_and<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_logical_and.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_logical_and<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_logical_and<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_logical_and<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_logical_and<bool>` inherits from `__true_type`.]
[:`has_logical_and<int, int, bool>` inherits from `__true_type`.]
[:`has_logical_and<int, int, long>` inherits from `__true_type`.]
[:`has_logical_and<int, double, bool>` inherits from `__true_type`.]
[:`has_logical_and<const int, int>::value` inherits from `__true_type`.]
[:`has_logical_and<int, int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator&&` is public or not:
if `operator&&` is defined as a private member of `Lhs` then
instantiating `has_logical_and<Lhs>` will produce a compiler error.
For this reason `has_logical_and` cannot be used to determine whether a type has a public `operator&&` or not.
``
struct A { private: void operator&&(const A&); };
boost::has_logical_and<A>::value; // error: A::operator&&(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator&&(const A&, const A&);
struct B { operator A(); };
boost::has_logical_and<A>::value; // this is fine
boost::has_logical_and<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator&&` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_logical_and.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator&&(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_logical_and< contains< good > >::value<<'\n'; // true
contains<good> g;
g&&g; // ok
// does not work for contains<bad>
std::cout<<boost::has_logical_and< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b&&b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

108
doc/has_logical_not.qbk Normal file
View File

@ -0,0 +1,108 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_logical_not has_logical_not]
template <class Rhs, class Ret=dont_care>
struct has_logical_not : public __tof {};
__inherit
If (i) `rhs` of type `Rhs` can be used in expression `!rhs`,
and (ii) `Ret=dont_care` or the result of expression `!rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of prefix `operator!`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Rhs rhs;
f(!rhs); // is valid if has_logical_not<Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_logical_not.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_logical_not<Rhs, Ret>::value_type` is the type `bool`.]
[:`has_logical_not<Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_logical_not<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_logical_not<bool>` inherits from `__true_type`.]
[:`has_logical_not<int, bool>` inherits from `__true_type`.]
[:`has_logical_not<int, long>` inherits from `__true_type`.]
[:`has_logical_not<double, double>` inherits from `__true_type`.]
[:`has_logical_not<double, bool>` inherits from `__true_type`.]
[:`has_logical_not<const bool>` inherits from `__true_type`.]
[:`has_logical_not<int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether prefix `operator!` is public or not:
if `operator!` is defined as a private member of `Rhs` then
instantiating `has_logical_not<Rhs>` will produce a compiler error.
For this reason `has_logical_not` cannot be used to determine whether a type has a public `operator!` or not.
``
struct A { private: void operator!(); };
boost::has_logical_not<A>::value; // error: A::operator!() is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator!(const A&);
struct B { operator A(); };
boost::has_logical_not<A>::value; // this is fine
boost::has_logical_not<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator!` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_logical_not.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator!(const contains<T> &rhs) {
return f(rhs.data);
}
class bad { };
class good { };
bool f(const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_logical_not< contains< good > >::value<<'\n'; // true
contains<good> g;
!g; // ok
// does not work for contains<bad>
std::cout<<boost::has_logical_not< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
!b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

108
doc/has_logical_or.qbk Normal file
View File

@ -0,0 +1,108 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_logical_or has_logical_or]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_logical_or : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs||rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs||rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator||`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs||rhs); // is valid if has_logical_or<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_logical_or.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_logical_or<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_logical_or<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_logical_or<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_logical_or<bool>` inherits from `__true_type`.]
[:`has_logical_or<int, int, bool>` inherits from `__true_type`.]
[:`has_logical_or<int, int, long>` inherits from `__true_type`.]
[:`has_logical_or<int, double, bool>` inherits from `__true_type`.]
[:`has_logical_or<const int, int>::value` inherits from `__true_type`.]
[:`has_logical_or<int, int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator||` is public or not:
if `operator||` is defined as a private member of `Lhs` then
instantiating `has_logical_or<Lhs>` will produce a compiler error.
For this reason `has_logical_or` cannot be used to determine whether a type has a public `operator||` or not.
``
struct A { private: void operator||(const A&); };
boost::has_logical_or<A>::value; // error: A::operator||(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator||(const A&, const A&);
struct B { operator A(); };
boost::has_logical_or<A>::value; // this is fine
boost::has_logical_or<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator||` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_logical_or.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator||(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_logical_or< contains< good > >::value<<'\n'; // true
contains<good> g;
g||g; // ok
// does not work for contains<bad>
std::cout<<boost::has_logical_or< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b||b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

109
doc/has_minus.qbk Normal file
View File

@ -0,0 +1,109 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_minus has_minus]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_minus : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs-rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs-rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator-`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs-rhs); // is valid if has_minus<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_minus.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_minus<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_minus<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_minus<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_minus<long>` inherits from `__true_type`.]
[:`has_minus<int, int, int>` inherits from `__true_type`.]
[:`has_minus<int, int, long>` inherits from `__true_type`.]
[:`has_minus<int, double, double>` inherits from `__true_type`.]
[:`has_minus<int, double, int>` inherits from `__true_type`.]
[:`has_minus<const int, int>::value` inherits from `__true_type`.]
[:`has_minus<int, int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator-` is public or not:
if `operator-` is defined as a private member of `Lhs` then
instantiating `has_minus<Lhs>` will produce a compiler error.
For this reason `has_minus` cannot be used to determine whether a type has a public `operator-` or not.
``
struct A { private: void operator-(const A&); };
boost::has_minus<A>::value; // error: A::operator-(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator-(const A&, const A&);
struct B { operator A(); };
boost::has_minus<A>::value; // this is fine
boost::has_minus<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator-` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_minus.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator-(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_minus< contains< good > >::value<<'\n'; // true
contains<good> g;
g-g; // ok
// does not work for contains<bad>
std::cout<<boost::has_minus< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b-b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

109
doc/has_minus_assign.qbk Normal file
View File

@ -0,0 +1,109 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_minus_assign has_minus_assign]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_minus_assign : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs-=rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs-=rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator-=`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs-=rhs); // is valid if has_minus_assign<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_minus_assign.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_minus_assign<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_minus_assign<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_minus_assign<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_minus_assign<long>` inherits from `__true_type`.]
[:`has_minus_assign<int, int, int>` inherits from `__true_type`.]
[:`has_minus_assign<int, int, long>` inherits from `__true_type`.]
[:`has_minus_assign<int, double, double>` inherits from `__true_type`.]
[:`has_minus_assign<int, double, int>` inherits from `__true_type`.]
[:`has_minus_assign<const int, int>::value` inherits from `__false_type`.]
[:`has_minus_assign<int, int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator-=` is public or not:
if `operator-=` is defined as a private member of `Lhs` then
instantiating `has_minus_assign<Lhs>` will produce a compiler error.
For this reason `has_minus_assign` cannot be used to determine whether a type has a public `operator-=` or not.
``
struct A { private: void operator-=(const A&); };
boost::has_minus_assign<A>::value; // error: A::operator-=(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator-=(const A&, const A&);
struct B { operator A(); };
boost::has_minus_assign<A>::value; // this is fine
boost::has_minus_assign<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator-=` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_minus_assign.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator-=(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_minus_assign< contains< good > >::value<<'\n'; // true
contains<good> g;
g-=g; // ok
// does not work for contains<bad>
std::cout<<boost::has_minus_assign< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b-=b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

107
doc/has_modulus.qbk Normal file
View File

@ -0,0 +1,107 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_modulus has_modulus]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_modulus : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs%rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs%rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator%`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs%rhs); // is valid if has_modulus<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_modulus.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_modulus<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_modulus<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_modulus<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_modulus<long>` inherits from `__true_type`.]
[:`has_modulus<int, int, int>` inherits from `__true_type`.]
[:`has_modulus<int, int, long>` inherits from `__true_type`.]
[:`has_modulus<const int, int>::value` inherits from `__true_type`.]
[:`has_modulus<int, double>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator%` is public or not:
if `operator%` is defined as a private member of `Lhs` then
instantiating `has_modulus<Lhs>` will produce a compiler error.
For this reason `has_modulus` cannot be used to determine whether a type has a public `operator%` or not.
``
struct A { private: void operator%(const A&); };
boost::has_modulus<A>::value; // error: A::operator%(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator%(const A&, const A&);
struct B { operator A(); };
boost::has_modulus<A>::value; // this is fine
boost::has_modulus<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator%` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_modulus.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator%(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_modulus< contains< good > >::value<<'\n'; // true
contains<good> g;
g%g; // ok
// does not work for contains<bad>
std::cout<<boost::has_modulus< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b%b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

107
doc/has_modulus_assign.qbk Normal file
View File

@ -0,0 +1,107 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_modulus_assign has_modulus_assign]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_modulus_assign : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs%=rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs%=rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator%=`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs%=rhs); // is valid if has_modulus_assign<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_modulus_assign.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_modulus_assign<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_modulus_assign<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_modulus_assign<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_modulus_assign<long>` inherits from `__true_type`.]
[:`has_modulus_assign<int, int, int>` inherits from `__true_type`.]
[:`has_modulus_assign<int, int, long>` inherits from `__true_type`.]
[:`has_modulus_assign<const int, int>::value` inherits from `__false_type`.]
[:`has_modulus_assign<int, double>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator%=` is public or not:
if `operator%=` is defined as a private member of `Lhs` then
instantiating `has_modulus_assign<Lhs>` will produce a compiler error.
For this reason `has_modulus_assign` cannot be used to determine whether a type has a public `operator%=` or not.
``
struct A { private: void operator%=(const A&); };
boost::has_modulus_assign<A>::value; // error: A::operator%=(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator%=(const A&, const A&);
struct B { operator A(); };
boost::has_modulus_assign<A>::value; // this is fine
boost::has_modulus_assign<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator%=` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_modulus_assign.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator%=(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_modulus_assign< contains< good > >::value<<'\n'; // true
contains<good> g;
g%=g; // ok
// does not work for contains<bad>
std::cout<<boost::has_modulus_assign< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b%=b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

109
doc/has_multiplies.qbk Normal file
View File

@ -0,0 +1,109 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_multiplies has_multiplies]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_multiplies : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs*rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs*rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator*`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs*rhs); // is valid if has_multiplies<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_multiplies.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_multiplies<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_multiplies<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_multiplies<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_multiplies<long>` inherits from `__true_type`.]
[:`has_multiplies<int, int, int>` inherits from `__true_type`.]
[:`has_multiplies<int, int, long>` inherits from `__true_type`.]
[:`has_multiplies<int, double, double>` inherits from `__true_type`.]
[:`has_multiplies<int, double, int>` inherits from `__true_type`.]
[:`has_multiplies<const int, int>::value` inherits from `__true_type`.]
[:`has_multiplies<int, int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator*` is public or not:
if `operator*` is defined as a private member of `Lhs` then
instantiating `has_multiplies<Lhs>` will produce a compiler error.
For this reason `has_multiplies` cannot be used to determine whether a type has a public `operator*` or not.
``
struct A { private: void operator*(const A&); };
boost::has_multiplies<A>::value; // error: A::operator*(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator*(const A&, const A&);
struct B { operator A(); };
boost::has_multiplies<A>::value; // this is fine
boost::has_multiplies<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator*` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_multiplies.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator*(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_multiplies< contains< good > >::value<<'\n'; // true
contains<good> g;
g*g; // ok
// does not work for contains<bad>
std::cout<<boost::has_multiplies< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b*b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

View File

@ -0,0 +1,109 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_multiplies_assign has_multiplies_assign]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_multiplies_assign : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs*=rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs*=rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator*=`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs*=rhs); // is valid if has_multiplies_assign<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_multiplies_assign.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_multiplies_assign<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_multiplies_assign<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_multiplies_assign<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_multiplies_assign<long>` inherits from `__true_type`.]
[:`has_multiplies_assign<int, int, int>` inherits from `__true_type`.]
[:`has_multiplies_assign<int, int, long>` inherits from `__true_type`.]
[:`has_multiplies_assign<int, double, double>` inherits from `__true_type`.]
[:`has_multiplies_assign<int, double, int>` inherits from `__true_type`.]
[:`has_multiplies_assign<const int, int>::value` inherits from `__false_type`.]
[:`has_multiplies_assign<int, int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator*=` is public or not:
if `operator*=` is defined as a private member of `Lhs` then
instantiating `has_multiplies_assign<Lhs>` will produce a compiler error.
For this reason `has_multiplies_assign` cannot be used to determine whether a type has a public `operator*=` or not.
``
struct A { private: void operator*=(const A&); };
boost::has_multiplies_assign<A>::value; // error: A::operator*=(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator*=(const A&, const A&);
struct B { operator A(); };
boost::has_multiplies_assign<A>::value; // this is fine
boost::has_multiplies_assign<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator*=` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_multiplies_assign.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator*=(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_multiplies_assign< contains< good > >::value<<'\n'; // true
contains<good> g;
g*=g; // ok
// does not work for contains<bad>
std::cout<<boost::has_multiplies_assign< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b*=b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

108
doc/has_negate.qbk Normal file
View File

@ -0,0 +1,108 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_negate has_negate]
template <class Rhs, class Ret=dont_care>
struct has_negate : public __tof {};
__inherit
If (i) `rhs` of type `Rhs` can be used in expression `-rhs`,
and (ii) `Ret=dont_care` or the result of expression `-rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of prefix `operator-`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Rhs rhs;
f(-rhs); // is valid if has_negate<Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_negate.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_negate<Rhs, Ret>::value_type` is the type `bool`.]
[:`has_negate<Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_negate<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_negate<long>` inherits from `__true_type`.]
[:`has_negate<int, int>` inherits from `__true_type`.]
[:`has_negate<int, long>` inherits from `__true_type`.]
[:`has_negate<double, double>` inherits from `__true_type`.]
[:`has_negate<double, int>` inherits from `__true_type`.]
[:`has_negate<const int>` inherits from `__true_type`.]
[:`has_negate<int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether prefix `operator-` is public or not:
if `operator-` is defined as a private member of `Rhs` then
instantiating `has_negate<Rhs>` will produce a compiler error.
For this reason `has_negate` cannot be used to determine whether a type has a public `operator-` or not.
``
struct A { private: void operator-(); };
boost::has_negate<A>::value; // error: A::operator-() is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator-(const A&);
struct B { operator A(); };
boost::has_negate<A>::value; // this is fine
boost::has_negate<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator-` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_negate.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator-(const contains<T> &rhs) {
return f(rhs.data);
}
class bad { };
class good { };
bool f(const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_negate< contains< good > >::value<<'\n'; // true
contains<good> g;
-g; // ok
// does not work for contains<bad>
std::cout<<boost::has_negate< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
-b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

View File

@ -12,9 +12,7 @@
__inherit If T is a (possibly cv-qualified) type with an overloaded new-operator
then inherits from __true_type, otherwise inherits from __false_type.
__compat Not usable with compilers that do not support "substitution failure is not an error"
(in which case BOOST_NO_SFINAE will be defined), also known to be broken with
the Borland/Codegear compiler.
[has_binary_operator_compat] Also known to be broken with the Borland/Codegear compilers.
__std_ref 12.5.

109
doc/has_not_equal_to.qbk Normal file
View File

@ -0,0 +1,109 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_not_equal_to has_not_equal_to]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_not_equal_to : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs!=rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs!=rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator!=`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs!=rhs); // is valid if has_not_equal_to<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_not_equal_to.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_not_equal_to<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_not_equal_to<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_not_equal_to<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_not_equal_to<long>` inherits from `__true_type`.]
[:`has_not_equal_to<int, int, bool>` inherits from `__true_type`.]
[:`has_not_equal_to<int, double, bool>` inherits from `__true_type`.]
[:`has_not_equal_to<const int>` inherits from `__true_type`.]
[:`has_not_equal_to<int*, int>` inherits from `__false_type`.]
[:`has_not_equal_to<int*, double*>` inherits from `__false_type`.]
[:`has_not_equal_to<int, int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator!=` is public or not:
if `operator!=` is defined as a private member of `Lhs` then
instantiating `has_not_equal_to<Lhs>` will produce a compiler error.
For this reason `has_not_equal_to` cannot be used to determine whether a type has a public `operator!=` or not.
``
struct A { private: void operator!=(const A&); };
boost::has_not_equal_to<A>::value; // error: A::operator!=(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator!=(const A&, const A&);
struct B { operator A(); };
boost::has_not_equal_to<A>::value; // this is fine
boost::has_not_equal_to<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator!=` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_not_equal_to.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator!=(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_not_equal_to< contains< good > >::value<<'\n'; // true
contains<good> g;
g!=g; // ok
// does not work for contains<bad>
std::cout<<boost::has_not_equal_to< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b!=b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

View File

@ -14,14 +14,11 @@ __inherit If T is a (possibly cv-qualified) type with a non-throwing assignment-
then inherits from __true_type, otherwise inherits from __false_type. Type `T`
must be a complete type.
__compat If the compiler does not support partial-specialization of class
templates, then this template can not be used with function types.
Without some (as yet unspecified) help from the compiler,
`has_nothrow_assign` will never report that a class or struct has a
non-throwing assignment-operator; this is always safe, if possibly sub-optimal.
Currently (May 2005) only Visual C++ 8 has the necessary compiler support to ensure that this
trait "just works".
__compat Either requires C++11 `noexcept` and `decltype` or else some (unspecified) help from the compiler.
Currently (June 2015) compilers more recent than Visual C++ 8, GCC-4.3, Greenhills 6.0,
Intel-11.0, and Codegear and all recent GCC versions have the necessary compiler __intrinsics to ensure that this
trait "just works". You may test to see if the necessary support is available
by checking to see if `defined(BOOST_HAS_NOTHROW_CONSTRUCTOR) || (!defined(BOOST_NO_CXX11_DECLTYPE) && !defined(BOOST_NO_CXX11_NOEXCEPT))` is true.
__header ` #include <boost/type_traits/has_nothrow_assign.hpp>` or ` #include <boost/type_traits.hpp>`

View File

@ -19,14 +19,11 @@ must be a complete type.
These two traits are synonyms for each other.
__compat If the compiler does not support partial-specialization of class
templates, then this template can not be used with function types.
Without some (as yet unspecified) help from the compiler,
`has_nothrow_constructor` will never report that a class or struct has a
non-throwing default-constructor; this is always safe, if possibly sub-optimal.
Currently (May 2005) only Visual C++ 8 has the necessary compiler __intrinsics to ensure that this
trait "just works".
__compat Either requires C++11 `noexcept` and `decltype` or else some (unspecified) help from the compiler.
Currently (June 2015) compilers more recent than Visual C++ 8, GCC-4.3, Greenhills 6.0,
Intel-11.0, and Codegear and all recent GCC versions have the necessary compiler __intrinsics to ensure that this
trait "just works". You may test to see if the necessary support is available
by checking to see if `defined(BOOST_HAS_NOTHROW_CONSTRUCTOR) || (!defined(BOOST_NO_CXX11_DECLTYPE) && !defined(BOOST_NO_CXX11_NOEXCEPT))` is true.
__header ` #include <boost/type_traits/has_nothrow_constructor.hpp>` or ` #include <boost/type_traits.hpp>`

View File

@ -19,14 +19,11 @@ must be a complete type.
These two traits are synonyms for each other.
__compat If the compiler does not support partial-specialization of class
templates, then this template can not be used with function types.
Without some (as yet unspecified) help from the compiler,
`has_nothrow_copy` will never report that a class or struct has a
non-throwing copy-constructor; this is always safe, if possibly sub-optimal.
Currently (May 2005) only Visual C++ 8 has the necessary compiler __intrinsics to ensure that this
trait "just works".
__compat Either requires C++11 `noexcept` and `decltype` or else some (unspecified) help from the compiler.
Currently (June 2015) compilers more recent than Visual C++ 8, GCC-4.3, Greenhills 6.0,
Intel-11.0, and Codegear and all recent GCC versions have the necessary compiler __intrinsics to ensure that this
trait "just works". You may test to see if the necessary support is available
by checking to see if `defined(BOOST_HAS_NOTHROW_COPY) || (!defined(BOOST_NO_CXX11_DECLTYPE) && !defined(BOOST_NO_CXX11_NOEXCEPT))` is true.
__header ` #include <boost/type_traits/has_nothrow_copy.hpp>` or ` #include <boost/type_traits.hpp>`

View File

@ -0,0 +1,29 @@
[/
Copyright 2015 John Maddock.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_nothrow_destruct has_nothrow_destructor]
template <class T>
struct has_nothrow_destructor : public __tof {};
__inherit If T is a (possibly cv-qualified) type with a non-throwing destructor
then inherits from __true_type, otherwise inherits from __false_type. Type `T`
must be a complete type.
__compat Either requires C++11 `noexcept` and `decltype` or else some (unspecified) help from the compiler.
You may test to see if the necessary support is available
by checking to see if `!defined(BOOST_NO_CXX11_DECLTYPE) && !defined(BOOST_NO_CXX11_NOEXCEPT)` is true.
__header ` #include <boost/type_traits/has_nothrow_copy.hpp>` or ` #include <boost/type_traits.hpp>`
[note
Note that destructors are assumed to be non-throwing unless they are explicitly marked otherwise with a `throw(something)` specification.
This is in line with the C++11 standard.
]
[endsect]

109
doc/has_plus.qbk Normal file
View File

@ -0,0 +1,109 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_plus has_plus]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_plus : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs+rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs+rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator+`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs+rhs); // is valid if has_plus<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_plus.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_plus<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_plus<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_plus<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_plus<long>` inherits from `__true_type`.]
[:`has_plus<int, int, int>` inherits from `__true_type`.]
[:`has_plus<int, int, long>` inherits from `__true_type`.]
[:`has_plus<int, double, double>` inherits from `__true_type`.]
[:`has_plus<int, double, int>` inherits from `__true_type`.]
[:`has_plus<const int, int>::value` inherits from `__true_type`.]
[:`has_plus<int, int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator+` is public or not:
if `operator+` is defined as a private member of `Lhs` then
instantiating `has_plus<Lhs>` will produce a compiler error.
For this reason `has_plus` cannot be used to determine whether a type has a public `operator+` or not.
``
struct A { private: void operator+(const A&); };
boost::has_plus<A>::value; // error: A::operator+(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator+(const A&, const A&);
struct B { operator A(); };
boost::has_plus<A>::value; // this is fine
boost::has_plus<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator+` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_plus.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator+(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_plus< contains< good > >::value<<'\n'; // true
contains<good> g;
g+g; // ok
// does not work for contains<bad>
std::cout<<boost::has_plus< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b+b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

109
doc/has_plus_assign.qbk Normal file
View File

@ -0,0 +1,109 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_plus_assign has_plus_assign]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_plus_assign : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs+=rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs+=rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator+=`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs+=rhs); // is valid if has_plus_assign<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_plus_assign.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_plus_assign<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_plus_assign<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_plus_assign<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_plus_assign<long>` inherits from `__true_type`.]
[:`has_plus_assign<int, int, int>` inherits from `__true_type`.]
[:`has_plus_assign<int, int, long>` inherits from `__true_type`.]
[:`has_plus_assign<int, double, double>` inherits from `__true_type`.]
[:`has_plus_assign<int, double, int>` inherits from `__true_type`.]
[:`has_plus_assign<const int, int>::value` inherits from `__false_type`.]
[:`has_plus_assign<int, int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator+=` is public or not:
if `operator+=` is defined as a private member of `Lhs` then
instantiating `has_plus_assign<Lhs>` will produce a compiler error.
For this reason `has_plus_assign` cannot be used to determine whether a type has a public `operator+=` or not.
``
struct A { private: void operator+=(const A&); };
boost::has_plus_assign<A>::value; // error: A::operator+=(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator+=(const A&, const A&);
struct B { operator A(); };
boost::has_plus_assign<A>::value; // this is fine
boost::has_plus_assign<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator+=` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_plus_assign.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator+=(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_plus_assign< contains< good > >::value<<'\n'; // true
contains<good> g;
g+=g; // ok
// does not work for contains<bad>
std::cout<<boost::has_plus_assign< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b+=b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

110
doc/has_post_decrement.qbk Normal file
View File

@ -0,0 +1,110 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_post_decrement has_post_decrement]
template <class Lhs, class Ret=dont_care>
struct has_post_decrement : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` can be used in expression `lhs--`,
and (ii) `Ret=dont_care` or the result of expression `lhs--` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of postfix `operator--`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
f(lhs--); // is valid if has_post_decrement<Lhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_post_decrement.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_post_decrement<Lhs, Ret>::value_type` is the type `bool`.]
[:`has_post_decrement<Lhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_post_decrement<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_post_decrement<long>` inherits from `__true_type`.]
[:`has_post_decrement<int, int>` inherits from `__true_type`.]
[:`has_post_decrement<int, long>` inherits from `__true_type`.]
[:`has_post_decrement<double, double>` inherits from `__true_type`.]
[:`has_post_decrement<double, int>` inherits from `__true_type`.]
[:`has_post_decrement<bool>` inherits from `__false_type`.]
[:`has_post_decrement<const int>` inherits from `__false_type`.]
[:`has_post_decrement<void*>` inherits from `__false_type`.]
[:`has_post_decrement<int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether postfix `operator--` is public or not:
if `operator--` is defined as a private member of `Lhs` then
instantiating `has_post_decrement<Lhs>` will produce a compiler error.
For this reason `has_post_decrement` cannot be used to determine whether a type has a public `operator--` or not.
``
struct A { private: void operator--(int); };
boost::has_post_decrement<A>::value; // error: A::operator--(int) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator--(const A&, int);
struct B { operator A(); };
boost::has_post_decrement<A>::value; // this is fine
boost::has_post_decrement<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator--` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_post_decrement.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator--(const contains<T> &lhs, int) {
return f(lhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_post_decrement< contains< good > >::value<<'\n'; // true
contains<good> g;
g--; // ok
// does not work for contains<bad>
std::cout<<boost::has_post_decrement< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b--; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

110
doc/has_post_increment.qbk Normal file
View File

@ -0,0 +1,110 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_post_increment has_post_increment]
template <class Lhs, class Ret=dont_care>
struct has_post_increment : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` can be used in expression `lhs++`,
and (ii) `Ret=dont_care` or the result of expression `lhs++` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of postfix `operator++`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
f(lhs++); // is valid if has_post_increment<Lhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_post_increment.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_post_increment<Lhs, Ret>::value_type` is the type `bool`.]
[:`has_post_increment<Lhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_post_increment<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_post_increment<long>` inherits from `__true_type`.]
[:`has_post_increment<int, int>` inherits from `__true_type`.]
[:`has_post_increment<int, long>` inherits from `__true_type`.]
[:`has_post_increment<double, double>` inherits from `__true_type`.]
[:`has_post_increment<double, int>` inherits from `__true_type`.]
[:`has_post_increment<bool>` inherits from `__true_type`.]
[:`has_post_increment<const int>` inherits from `__false_type`.]
[:`has_post_increment<void*>` inherits from `__false_type`.]
[:`has_post_increment<int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether postfix `operator++` is public or not:
if `operator++` is defined as a private member of `Lhs` then
instantiating `has_post_increment<Lhs>` will produce a compiler error.
For this reason `has_post_increment` cannot be used to determine whether a type has a public `operator++` or not.
``
struct A { private: void operator++(int); };
boost::has_post_increment<A>::value; // error: A::operator++(int) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator++(const A&, int);
struct B { operator A(); };
boost::has_post_increment<A>::value; // this is fine
boost::has_post_increment<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator++` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_post_increment.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator++(const contains<T> &lhs, int) {
return f(lhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_post_increment< contains< good > >::value<<'\n'; // true
contains<good> g;
g++; // ok
// does not work for contains<bad>
std::cout<<boost::has_post_increment< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b++; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

110
doc/has_pre_decrement.qbk Normal file
View File

@ -0,0 +1,110 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_pre_decrement has_pre_decrement]
template <class Rhs, class Ret=dont_care>
struct has_pre_decrement : public __tof {};
__inherit
If (i) `rhs` of type `Rhs` can be used in expression `--rhs`,
and (ii) `Ret=dont_care` or the result of expression `--rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of prefix `operator--`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Rhs rhs;
f(--rhs); // is valid if has_pre_decrement<Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_pre_decrement.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_pre_decrement<Rhs, Ret>::value_type` is the type `bool`.]
[:`has_pre_decrement<Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_pre_decrement<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_pre_decrement<long>` inherits from `__true_type`.]
[:`has_pre_decrement<int, int>` inherits from `__true_type`.]
[:`has_pre_decrement<int, long>` inherits from `__true_type`.]
[:`has_pre_decrement<double, double>` inherits from `__true_type`.]
[:`has_pre_decrement<double, int>` inherits from `__true_type`.]
[:`has_pre_decrement<bool>` inherits from `__false_type`.]
[:`has_pre_decrement<const int>` inherits from `__false_type`.]
[:`has_pre_decrement<void*>` inherits from `__false_type`.]
[:`has_pre_decrement<int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether prefix `operator--` is public or not:
if `operator--` is defined as a private member of `Rhs` then
instantiating `has_pre_decrement<Rhs>` will produce a compiler error.
For this reason `has_pre_decrement` cannot be used to determine whether a type has a public `operator--` or not.
``
struct A { private: void operator--(); };
boost::has_pre_decrement<A>::value; // error: A::operator--() is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator--(const A&);
struct B { operator A(); };
boost::has_pre_decrement<A>::value; // this is fine
boost::has_pre_decrement<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator--` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_pre_decrement.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator--(const contains<T> &rhs) {
return f(rhs.data);
}
class bad { };
class good { };
bool f(const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_pre_decrement< contains< good > >::value<<'\n'; // true
contains<good> g;
--g; // ok
// does not work for contains<bad>
std::cout<<boost::has_pre_decrement< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
--b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

110
doc/has_pre_increment.qbk Normal file
View File

@ -0,0 +1,110 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_pre_increment has_pre_increment]
template <class Rhs, class Ret=dont_care>
struct has_pre_increment : public __tof {};
__inherit
If (i) `rhs` of type `Rhs` can be used in expression `++rhs`,
and (ii) `Ret=dont_care` or the result of expression `++rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of prefix `operator++`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Rhs rhs;
f(++rhs); // is valid if has_pre_increment<Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_pre_increment.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_pre_increment<Rhs, Ret>::value_type` is the type `bool`.]
[:`has_pre_increment<Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_pre_increment<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_pre_increment<long>` inherits from `__true_type`.]
[:`has_pre_increment<int, int>` inherits from `__true_type`.]
[:`has_pre_increment<int, long>` inherits from `__true_type`.]
[:`has_pre_increment<double, double>` inherits from `__true_type`.]
[:`has_pre_increment<double, int>` inherits from `__true_type`.]
[:`has_pre_increment<bool>` inherits from `__true_type`.]
[:`has_pre_increment<const int>` inherits from `__false_type`.]
[:`has_pre_increment<void*>` inherits from `__false_type`.]
[:`has_pre_increment<int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether prefix `operator++` is public or not:
if `operator++` is defined as a private member of `Rhs` then
instantiating `has_pre_increment<Rhs>` will produce a compiler error.
For this reason `has_pre_increment` cannot be used to determine whether a type has a public `operator++` or not.
``
struct A { private: void operator++(); };
boost::has_pre_increment<A>::value; // error: A::operator++() is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator++(const A&);
struct B { operator A(); };
boost::has_pre_increment<A>::value; // this is fine
boost::has_pre_increment<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator++` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_pre_increment.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator++(const contains<T> &rhs) {
return f(rhs.data);
}
class bad { };
class good { };
bool f(const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_pre_increment< contains< good > >::value<<'\n'; // true
contains<good> g;
++g; // ok
// does not work for contains<bad>
std::cout<<boost::has_pre_increment< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
++b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

110
doc/has_right_shift.qbk Normal file
View File

@ -0,0 +1,110 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_right_shift has_right_shift]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_right_shift : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs>>rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs>>rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator>>`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs>>rhs); // is valid if has_right_shift<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_right_shift.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_right_shift<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_right_shift<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_right_shift<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_right_shift<long>` inherits from `__true_type`.]
[:`has_right_shift<int, int, int>` inherits from `__true_type`.]
[:`has_right_shift<const int, int>` inherits from `__true_type`.]
[:`has_right_shift<std::istream, int&>` inherits from `__true_type`.]
[:`has_right_shift<std::istream, char*, std::ostream>` inherits from `__true_type`.]
[:`has_right_shift<std::istream, std::string&>` inherits from `__true_type`.]
[:`has_right_shift<int, double, bool>` inherits from `__false_type`.]
[:`has_right_shift<int, int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator>>` is public or not:
if `operator>>` is defined as a private member of `Lhs` then
instantiating `has_right_shift<Lhs>` will produce a compiler error.
For this reason `has_right_shift` cannot be used to determine whether a type has a public `operator>>` or not.
``
struct A { private: void operator>>(const A&); };
boost::has_right_shift<A>::value; // error: A::operator>>(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator>>(const A&, const A&);
struct B { operator A(); };
boost::has_right_shift<A>::value; // this is fine
boost::has_right_shift<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator>>` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_right_shift.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator>>(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_right_shift< contains< good > >::value<<'\n'; // true
contains<good> g;
g>>g; // ok
// does not work for contains<bad>
std::cout<<boost::has_right_shift< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b>>b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

View File

@ -0,0 +1,107 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_right_shift_assign has_right_shift_assign]
template <class Lhs, class Rhs=Lhs, class Ret=dont_care>
struct has_right_shift_assign : public __tof {};
__inherit
If (i) `lhs` of type `Lhs` and `rhs` of type `Rhs` can be used in expression `lhs>>=rhs`,
and (ii) `Ret=dont_care` or the result of expression `lhs>>=rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of binary `operator>>=`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Lhs lhs;
Rhs rhs;
f(lhs>>=rhs); // is valid if has_right_shift_assign<Lhs, Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_right_shift_assign.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_right_shift_assign<Lhs, Rhs, Ret>::value_type` is the type `bool`.]
[:`has_right_shift_assign<Lhs, Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_right_shift_assign<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_right_shift_assign<long>` inherits from `__true_type`.]
[:`has_right_shift_assign<int, int, int>` inherits from `__true_type`.]
[:`has_right_shift_assign<const int, int>` inherits from `__false_type`.]
[:`has_right_shift_assign<int, double, bool>` inherits from `__false_type`.]
[:`has_right_shift_assign<int, int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether binary `operator>>=` is public or not:
if `operator>>=` is defined as a private member of `Lhs` then
instantiating `has_right_shift_assign<Lhs>` will produce a compiler error.
For this reason `has_right_shift_assign` cannot be used to determine whether a type has a public `operator>>=` or not.
``
struct A { private: void operator>>=(const A&); };
boost::has_right_shift_assign<A>::value; // error: A::operator>>=(const A&) is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator>>=(const A&, const A&);
struct B { operator A(); };
boost::has_right_shift_assign<A>::value; // this is fine
boost::has_right_shift_assign<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator>>=` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_right_shift_assign.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator>>=(const contains<T> &lhs, const contains<T> &rhs) {
return f(lhs.data, rhs.data);
}
class bad { };
class good { };
bool f(const good&, const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_right_shift_assign< contains< good > >::value<<'\n'; // true
contains<good> g;
g>>=g; // ok
// does not work for contains<bad>
std::cout<<boost::has_right_shift_assign< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
b>>=b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

View File

@ -16,14 +16,16 @@ If a type has a trivial assignment-operator then the operator has the same effec
as copying the bits of one object to the other:
calls to the operator can be safely replaced with a call to `memcpy`.
__compat If the compiler does not support partial-specialization of class
templates, then this template can not be used with function types.
Without some (as yet unspecified) help from the compiler,
__compat Without some (as yet unspecified) help from the compiler,
has_trivial_assign will never report that a user-defined class or struct has a
trivial constructor; this is always safe, if possibly sub-optimal. Currently
(May 2005) only MWCW 9 and Visual C++ 8 have the necessary compiler __intrinsics to detect
user-defined classes with trivial constructors.
trivial constructor; this is always safe, if possibly sub-optimal. In order to
correctly handle deleted or private assignment operators, the compiler must also
support C++11's `decltype`.
Currently (May 2015) compilers more recent than Visual C++ 8, GCC-4.3, Greenhills 6.0,
Intel-11.0, and Codegear have the necessary compiler __intrinsics to ensure that this
trait "just works". You may also test to see if the necessary __intrinsics are available
by checking to see if the macro `BOOST_HAS_TRIVIAL_ASSIGN` is defined.
__std_ref 12.8p11.

View File

@ -24,14 +24,16 @@ to omit a call to a single trivial-constructor call is of no benefit whatsoever.
However, if loops and/or exception handling code can also be omitted, then some
benefit in terms of code size and speed can be obtained.
__compat If the compiler does not support partial-specialization of class
templates, then this template can not be used with function types.
Without some (as yet unspecified) help from the compiler,
__compat Without some (as yet unspecified) help from the compiler,
has_trivial_constructor will never report that a user-defined class or struct has a
trivial constructor; this is always safe, if possibly sub-optimal. Currently
(May 2005) only MWCW 9 and Visual C++ 8 have the necessary compiler __intrinsics to detect
user-defined classes with trivial constructors.
trivial constructor; this is always safe, if possibly sub-optimal.
In addition, in order to correctly handle private or deleted default-constructors then
C++11's `deltype` is required.
Currently (May 2015) compilers more recent than Visual C++ 8, GCC-4.3, Greenhills 6.0,
Intel-11.0, and Codegear have the necessary compiler __intrinsics to ensure that this
trait "just works". You may also test to see if the necessary __intrinsics are available
by checking to see if the macro `BOOST_HAS_TRIVIAL_CONSTRUCTOR` is defined.
__std_ref 12.1p6.

View File

@ -22,14 +22,16 @@ If a type has a trivial copy-constructor then the constructor has the same effec
as copying the bits of one object to the other:
calls to the constructor can be safely replaced with a call to `memcpy`.
__compat If the compiler does not support partial-specialization of class
templates, then this template can not be used with function types.
Without some (as yet unspecified) help from the compiler,
__compat Without some (as yet unspecified) help from the compiler,
has_trivial_copy will never report that a user-defined class or struct has a
trivial constructor; this is always safe, if possibly sub-optimal. Currently
(May 2005) only MWCW 9 and Visual C++ 8 have the necessary compiler __intrinsics to detect
user-defined classes with trivial constructors.
trivial constructor; this is always safe, if possibly sub-optimal.
In addition, in order to correctly handle deleted or private copy-constructors
then C++11's `dectype` is required.
Currently (May 2015) compilers more recent than Visual C++ 8, GCC-4.3, Greenhills 6.0,
Intel-11.0, and Codegear have the necessary compiler __intrinsics to ensure that this
trait "just works". You may also test to see if the necessary __intrinsics are available
by checking to see if the macro `BOOST_HAS_TRIVIAL_COPY` is defined.
__std_ref 12.8p6.

View File

@ -18,14 +18,16 @@ to omit a call to a single trivial-constructor call is of no benefit whatsoever.
However, if loops and/or exception handling code can also be omitted, then some
benefit in terms of code size and speed can be obtained.
__compat If the compiler does not support partial-specialization of class
templates, then this template can not be used with function types.
Without some (as yet unspecified) help from the compiler,
__compat Without some (as yet unspecified) help from the compiler,
has_trivial_destructor will never report that a user-defined class or struct has a
trivial destructor; this is always safe, if possibly sub-optimal. Currently
(May 2005) only MWCW 9 and Visual C++ 8 have the necessary compiler __intrinsics to detect
user-defined classes with trivial constructors.
trivial destructor; this is always safe, if possibly sub-optimal.
In addition, in order to correctly handle deleted or private destructors then
support for C++11's `decltype` is required.
Currently (June 2015) compilers more recent than Visual C++ 8, GCC-4.3, Greenhills 6.0,
Intel-11.0, and Codegear have the necessary compiler __intrinsics to ensure that this
trait "just works". You may also test to see if the necessary __intrinsics are available
by checking to see if the macro `BOOST_HAS_TRIVIAL_DESTRUCTOR` is defined.
__std_ref 12.4p3.

View File

@ -0,0 +1,48 @@
[/
Copyright 2007 John Maddock.
Copyright 2013 Antony Polukhin.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_trivial_move_assign has_trivial_move_assign]
template <class T>
struct has_trivial_move_assign : public __tof {};
__inherit If T is a (possibly cv-qualified) type with a trivial move assignment-operator
then inherits from __true_type, otherwise inherits from __false_type.
If a type has a trivial move assignment-operator then the operator has the same effect
as copying the bits of one object to the other:
calls to the operator can be safely replaced with a call to `memcpy`.
__compat Without some (as yet unspecified) help from the compiler,
has_trivial_move_assign will never report that a user-defined class or struct has a
trivial move assign; this is always safe, if possibly sub-optimal.
In addition, in order to correctly handle private or deleted move assignment
operators then c++11's `decltype` is required.
Currently (June 2015) compilers that have the necessary __intrinsics to ensure that this
trait "just works" include Clang, GCC-5.1 and MSVC-12.0.
You may also test to see if the necessary __intrinsics are available
by checking to see if the macro `BOOST_HAS_TRIVIAL_MOVE_ASSIGN` is defined.
__header ` #include <boost/type_traits/has_trivial_move_assign.hpp>` or ` #include <boost/type_traits.hpp>`
__examples
[:`has_trivial_move_assign<int>` inherits from `__true_type`.]
[:`has_trivial_move_assign<char*>::type` is the type `__true_type`.]
[:`has_trivial_move_assign<int (*)(long)>::value` is an integral constant
expression that evaluates to /true/.]
[:`has_trivial_move_assign<MyClass>::value` is an integral constant
expression that evaluates to /false/.]
[:`has_trivial_move_assign<T>::value_type` is the type `bool`.]
[endsect]

View File

@ -0,0 +1,49 @@
[/
Copyright 2007 John Maddock.
Copyright 2013 Antony Polukhin.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_trivial_move_constructor has_trivial_move_constructor]
template <class T>
struct has_trivial_move_constructor : public __tof {};
__inherit If T is a (possibly cv-qualified) type with a trivial move-constructor
then inherits from __true_type, otherwise inherits from __false_type.
If a type has a trivial move-constructor then the constructor has the same effect
as copying the bits of one object to the other:
calls to the constructor can be safely replaced with a call to `memcpy`.
__compat Without some (as yet unspecified) help from the compiler,
has_trivial_move_constructor will never report that a user-defined class or struct has a
trivial constructor; this is always safe, if possibly sub-optimal.
In addition C++11's `decltype` is required to correctly support deleted or private
move constructors.
Currently (June 2015) compilers that have the necessary __intrinsics to ensure that this
trait "just works" include Clang, GCC-5.1, and MSVC-12.0.
You may also test to see if the necessary __intrinsics are available
by checking to see if the macro `BOOST_HAS_TRIVIAL_MOVE_CONSTRUCTOR` is defined.
__header ` #include <boost/type_traits/has_trivial_move_constructor.hpp>` or ` #include <boost/type_traits.hpp>`
__examples
[:`has_trivial_move_constructor<int>` inherits from `__true_type`.]
[:`has_trivial_move_constructor<char*>::type` is the type `__true_type`.]
[:`has_trivial_move_constructor<int (*)(long)>::value` is an integral constant
expression that evaluates to /true/.]
[:`has_trivial_move_constructor<MyClass>::value` is an integral constant
expression that evaluates to /false/.]
[:`has_trivial_move_constructor<T>::value_type` is the type `bool`.]
[endsect]

108
doc/has_unary_minus.qbk Normal file
View File

@ -0,0 +1,108 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_unary_minus has_unary_minus]
template <class Rhs, class Ret=dont_care>
struct has_unary_minus : public __tof {};
__inherit
If (i) `rhs` of type `Rhs` can be used in expression `-rhs`,
and (ii) `Ret=dont_care` or the result of expression `-rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of prefix `operator-`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Rhs rhs;
f(-rhs); // is valid if has_unary_minus<Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_unary_minus.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_unary_minus<Rhs, Ret>::value_type` is the type `bool`.]
[:`has_unary_minus<Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_unary_minus<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_unary_minus<long>` inherits from `__true_type`.]
[:`has_unary_minus<int, int>` inherits from `__true_type`.]
[:`has_unary_minus<int, long>` inherits from `__true_type`.]
[:`has_unary_minus<double, double>` inherits from `__true_type`.]
[:`has_unary_minus<double, int>` inherits from `__true_type`.]
[:`has_unary_minus<const int>` inherits from `__true_type`.]
[:`has_unary_minus<int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether prefix `operator-` is public or not:
if `operator-` is defined as a private member of `Rhs` then
instantiating `has_unary_minus<Rhs>` will produce a compiler error.
For this reason `has_unary_minus` cannot be used to determine whether a type has a public `operator-` or not.
``
struct A { private: void operator-(); };
boost::has_unary_minus<A>::value; // error: A::operator-() is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator-(const A&);
struct B { operator A(); };
boost::has_unary_minus<A>::value; // this is fine
boost::has_unary_minus<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator-` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_unary_minus.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator-(const contains<T> &rhs) {
return f(rhs.data);
}
class bad { };
class good { };
bool f(const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_unary_minus< contains< good > >::value<<'\n'; // true
contains<good> g;
-g; // ok
// does not work for contains<bad>
std::cout<<boost::has_unary_minus< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
-b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

108
doc/has_unary_plus.qbk Normal file
View File

@ -0,0 +1,108 @@
[/
(C) Copyright 2009-2011 Frederic Bron.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
]
[section:has_unary_plus has_unary_plus]
template <class Rhs, class Ret=dont_care>
struct has_unary_plus : public __tof {};
__inherit
If (i) `rhs` of type `Rhs` can be used in expression `+rhs`,
and (ii) `Ret=dont_care` or the result of expression `+rhs` is convertible to `Ret`
then inherits from __true_type,
otherwise inherits from __false_type.
The default behaviour (`Ret=dont_care`) is to not check for the return value of prefix `operator+`.
If `Ret` is different from the default `dont_care` type, the return value is checked to be convertible to `Ret`.
Convertible to `Ret` means that the return value of the operator can be used as argument to a function expecting `Ret`:
``
void f(Ret);
Rhs rhs;
f(+rhs); // is valid if has_unary_plus<Rhs, Ret>::value==true
``
If `Ret=void`, the return type is checked to be exactly `void`.
__header `#include <boost/type_traits/has_unary_plus.hpp>` or `#include <boost/type_traits/has_operator.hpp>` or `#include <boost/type_traits.hpp>`
[has_binary_operator_compat]
__examples
[:`has_unary_plus<Rhs, Ret>::value_type` is the type `bool`.]
[:`has_unary_plus<Rhs, Ret>::value` is a `bool` integral constant expression.]
[:`has_unary_plus<int>::value` is a `bool` integral constant expression that evaluates to `true`.]
[:`has_unary_plus<long>` inherits from `__true_type`.]
[:`has_unary_plus<int, int>` inherits from `__true_type`.]
[:`has_unary_plus<int, long>` inherits from `__true_type`.]
[:`has_unary_plus<double, double>` inherits from `__true_type`.]
[:`has_unary_plus<double, int>` inherits from `__true_type`.]
[:`has_unary_plus<const int>` inherits from `__true_type`.]
[:`has_unary_plus<int, std::string>` inherits from `__false_type`.]
[*See also:] [link boost_typetraits.category.value_traits.operators Operator Type Traits]
[*Known issues:]
* This trait cannot detect whether prefix `operator+` is public or not:
if `operator+` is defined as a private member of `Rhs` then
instantiating `has_unary_plus<Rhs>` will produce a compiler error.
For this reason `has_unary_plus` cannot be used to determine whether a type has a public `operator+` or not.
``
struct A { private: void operator+(); };
boost::has_unary_plus<A>::value; // error: A::operator+() is private
``
* There is an issue if the operator exists only for type `A` and `B` is
convertible to `A`. In this case, the compiler will report an ambiguous overload.
``
struct A { };
void operator+(const A&);
struct B { operator A(); };
boost::has_unary_plus<A>::value; // this is fine
boost::has_unary_plus<B>::value; // error: ambiguous overload
``
* There is an issue when applying this trait to template classes.
If `operator+` is defined but does not bind for a given template type,
it is still detected by the trait which returns `true` instead of `false`.
Example:
``
#include <boost/type_traits/has_unary_plus.hpp>
#include <iostream>
template <class T>
struct contains { T data; };
template <class T>
bool operator+(const contains<T> &rhs) {
return f(rhs.data);
}
class bad { };
class good { };
bool f(const good&) { }
int main() {
std::cout<<std::boolalpha;
// works fine for contains<good>
std::cout<<boost::has_unary_plus< contains< good > >::value<<'\n'; // true
contains<good> g;
+g; // ok
// does not work for contains<bad>
std::cout<<boost::has_unary_plus< contains< bad > >::value<<'\n'; // true, should be false
contains<bad> b;
+b; // compile time error
return 0;
}
``
* `volatile` qualifier is not properly handled and would lead to undefined behavior
[endsect]

View File

@ -12,13 +12,16 @@
__inherit If T is a (possibly cv-qualified) type with a virtual destructor
then inherits from __true_type, otherwise inherits from __false_type.
__compat This trait is provided for completeness, since it's part of the
Technical Report on C++ Library Extensions. However, there is currently no
way to portably implement this trait. The default version provided
__compat There is currently no
way to portably implement this trait: the default version
always inherits from __false_type, and has to be explicitly specialized for
types with virtual destructors unless the compiler used has compiler __intrinsics
that enable the trait to do the right thing: currently (May 2005) only Visual C++
8 and GCC-4.3 have the necessary __intrinsics.
that enable the trait to do the right thing:
Currently (June 2015) compilers more recent than Visual C++ 8, GCC-4.3, Greenhills 6.0,
Intel-11.0, plus Codegear and Clang have the necessary compiler __intrinsics to ensure that this
trait "just works". You may also test to see if the necessary __intrinsics are available
by checking to see if the macro `BOOST_HAS_VIRTUAL_DESTRUCTOR` is defined.
__std_ref 12.4.

View File

@ -7,6 +7,49 @@
[section:history History]
[h4 Boost 1.64.0]
* Added new trait __make_void.
[h4 Boost 1.60.0]
* Refactored traits to depend only on Boost.Config. Greatly simplified code to improve readability and remove workarounds for old compilers no longer supported.
* Fix __decay to follow C++11 semantics, see [@https://svn.boost.org/trac/boost/ticket/7760 #7760].
* Added a number of new traits __is_assignable, __is_default_constructible, __is_constructible and __is_destructible required to fix bugs in a number of other traits,
see for example [@https://svn.boost.org/trac/boost/ticket/7760 #11324].
[h4 Boost 1.58.0]
* Fixed issue with CUDA on Clang compiler see [@https://svn.boost.org/trac/boost/ticket/10694 #10694].
* Fixed __is_nothrow_move_assignable and __is_nothrow_move_constructible to work on VC12 and later.
[h4 Boost 1.57.0]
* Added new traits __is_copy_assignable and __is_final.
* Misc fixes for newer versions of clang and msvc-14.
[h4 Boost 1.56.0]
* Fixed issues [@https://svn.boost.org/trac/boost/ticket/7317 #7317],
[@https://svn.boost.org/trac/boost/ticket/9474 #9474].
[h4 Boost 1.55.0]
* Added new trait __is_copy_constructible.
[h4 Boost 1.54.0]
* Added new traits __is_nothrow_move_assignable, __is_nothrow_move_constructible, __has_trivial_move_assign,
__has_trivial_move_constructor.
[h4 Boost 1.47.0]
* [* Breaking change]: changed __is_convertible to C++0x behaviour when possible.
* Fixed issues [@https://svn.boost.org/trac/boost/ticket/5271 #5271],
[@https://svn.boost.org/trac/boost/ticket/4530 #4530].
[h4 Boost 1.45.0]
* Added new traits __add_rvalue_reference, __add_lvalue_reference and __common_type.

View File

@ -1,10 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Background and Tutorial</title>
<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="prev" href="intro.html" title="Introduction">
@ -23,7 +22,7 @@
<div class="spirit-nav">
<a accesskey="p" href="intro.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="category.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="boost_typetraits.background"></a><a class="link" href="background.html" title="Background and Tutorial">Background and Tutorial</a>
</h2></div></div></div>
@ -56,9 +55,10 @@
terminated string, safe in the knowledge that specializations of <code class="computeroutput"><span class="identifier">char_traits</span></code> will use the most appropriate
method available to them.
</p>
<a name="boost_typetraits.background.type_traits"></a><h5>
<a name="id1005124"></a>
<a class="link" href="background.html#boost_typetraits.background.type_traits">Type Traits</a>
<h5>
<a name="boost_typetraits.background.h0"></a>
<span class="phrase"><a name="boost_typetraits.background.type_traits"></a></span><a class="link" href="background.html#boost_typetraits.background.type_traits">Type
Traits</a>
</h5>
<p>
Class <code class="computeroutput"><span class="identifier">char_traits</span></code> is a classic
@ -84,9 +84,9 @@
for brevity, namespace-qualification is omitted in most of the code samples
given.
</p>
<a name="boost_typetraits.background.implementation"></a><h5>
<a name="id1005188"></a>
<a class="link" href="background.html#boost_typetraits.background.implementation">Implementation</a>
<h5>
<a name="boost_typetraits.background.h1"></a>
<span class="phrase"><a name="boost_typetraits.background.implementation"></a></span><a class="link" href="background.html#boost_typetraits.background.implementation">Implementation</a>
</h5>
<p>
There are far too many separate classes contained in the type-traits library
@ -98,10 +98,10 @@
from <code class="computeroutput"><a class="link" href="reference/integral_constant.html" title="integral_constant">true_type</a></code>
only if <code class="computeroutput"><span class="identifier">T</span></code> is <code class="computeroutput"><span class="keyword">void</span></code>.
</p>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="reference/is_void.html" title="is_void">is_void</a> <span class="special">:</span> <span class="keyword">public</span> <a class="link" href="reference/integral_constant.html" title="integral_constant">false_type</a><span class="special">{};</span>
<span class="keyword">template</span> <span class="special">&lt;&gt;</span>
<span class="keyword">template</span> <span class="special">&lt;&gt;</span>
<span class="keyword">struct</span> <a class="link" href="reference/is_void.html" title="is_void">is_void</a><span class="special">&lt;</span><span class="keyword">void</span><span class="special">&gt;</span> <span class="special">:</span> <span class="keyword">public</span> <a class="link" href="reference/integral_constant.html" title="integral_constant">true_type</a><span class="special">{};</span>
</pre>
<p>
@ -116,10 +116,10 @@
a pointer, and a partial specialization to handle all the cases where T is
a pointer:
</p>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="reference/is_pointer.html" title="is_pointer">is_pointer</a> <span class="special">:</span> <span class="keyword">public</span> <a class="link" href="reference/integral_constant.html" title="integral_constant">false_type</a><span class="special">{};</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="reference/is_pointer.html" title="is_pointer">is_pointer</a><span class="special">&lt;</span><span class="identifier">T</span><span class="special">*&gt;</span> <span class="special">:</span> <span class="keyword">public</span> <a class="link" href="reference/integral_constant.html" title="integral_constant">true_type</a><span class="special">{};</span>
</pre>
<p>
@ -155,11 +155,11 @@
that is the same type as T but with any top-level array bounds removed; this
is an example of a traits class that performs a transformation on a type:
</p>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="reference/remove_extent.html" title="remove_extent">remove_extent</a>
<span class="special">{</span> <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">type</span><span class="special">;</span> <span class="special">};</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">&gt;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">N</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="reference/remove_extent.html" title="remove_extent">remove_extent</a><span class="special">&lt;</span><span class="identifier">T</span><span class="special">[</span><span class="identifier">N</span><span class="special">]&gt;</span>
<span class="special">{</span> <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">type</span><span class="special">;</span> <span class="special">};</span>
</pre>
@ -174,9 +174,10 @@
after the class name do have to match the number and type of the parameters
in the default template.
</p>
<a name="boost_typetraits.background.optimized_copy"></a><h5>
<a name="id1014129"></a>
<a class="link" href="background.html#boost_typetraits.background.optimized_copy">Optimized copy</a>
<h5>
<a name="boost_typetraits.background.h2"></a>
<span class="phrase"><a name="boost_typetraits.background.optimized_copy"></a></span><a class="link" href="background.html#boost_typetraits.background.optimized_copy">Optimized
copy</a>
</h5>
<p>
As an example of how the type traits classes can be used, consider the standard
@ -194,16 +195,16 @@
copy in terms of <code class="computeroutput"><span class="identifier">memcpy</span></code> all
of the following conditions need to be met:
</p>
<div class="itemizedlist"><ul type="disc">
<li>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
Both of the iterator types <code class="computeroutput"><span class="identifier">Iter1</span></code>
and <code class="computeroutput"><span class="identifier">Iter2</span></code> must be pointers.
</li>
<li>
<li class="listitem">
Both <code class="computeroutput"><span class="identifier">Iter1</span></code> and <code class="computeroutput"><span class="identifier">Iter2</span></code> must point to the same type - excluding
const and volatile-qualifiers.
</li>
<li>
<li class="listitem">
The type pointed to by <code class="computeroutput"><span class="identifier">Iter1</span></code>
must have a trivial assignment operator.
</li>
@ -211,14 +212,14 @@
<p>
By trivial assignment operator we mean that the type is either a scalar type<a class="link" href="background.html#background.references">[3]</a> or:
</p>
<div class="itemizedlist"><ul type="disc">
<li>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
The type has no user defined assignment operator.
</li>
<li>
<li class="listitem">
The type does not have any data members that are references.
</li>
<li>
<li class="listitem">
All base classes, and all data member objects must have trivial assignment
operators.
</li>
@ -239,17 +240,18 @@
examples</a>. The code begins by defining a template function <code class="computeroutput"><span class="identifier">do_copy</span></code> that performs a "slow but safe"
copy. The last parameter passed to this function may be either a <code class="computeroutput"><a class="link" href="reference/integral_constant.html" title="integral_constant">true_type</a></code>
or a <code class="computeroutput"><a class="link" href="reference/integral_constant.html" title="integral_constant">false_type</a></code>.
Following that there is an overload of do<span class="underline">copy that
uses `memcpy`: this time the iterators are required to actually be pointers
to the same type, and the final parameter must be a `</span>_true_type<code class="computeroutput"><span class="special">.</span> <span class="identifier">Finally</span><span class="special">,</span> <span class="identifier">the</span> <span class="identifier">version</span>
<span class="identifier">of</span> </code>copy<code class="computeroutput"> <span class="identifier">calls</span>
</code>do<span class="underline">copy`, passing `</span>_has_trivial_assign&lt;value_type&gt;()`
as the final parameter: this will dispatch to the optimized version where appropriate,
otherwise it will call the "slow but safe version".
Following that there is an overload of do_copy that uses <code class="computeroutput"><span class="identifier">memcpy</span></code>:
this time the iterators are required to actually be pointers to the same type,
and the final parameter must be a <code class="computeroutput"><a class="link" href="reference/integral_constant.html" title="integral_constant">true_type</a></code>.
Finally, the version of <code class="computeroutput"><span class="identifier">copy</span></code>
calls <code class="computeroutput"><span class="identifier">do_copy</span></code>, passing <code class="computeroutput"><a class="link" href="reference/has_trivial_assign.html" title="has_trivial_assign">has_trivial_assign</a><span class="special">&lt;</span><span class="identifier">value_type</span><span class="special">&gt;()</span></code> as the final parameter: this will dispatch
to the optimized version where appropriate, otherwise it will call the "slow
but safe version".
</p>
<a name="boost_typetraits.background.was_it_worth_it_"></a><h5>
<a name="id1014495"></a>
<a class="link" href="background.html#boost_typetraits.background.was_it_worth_it_">Was it worth it?</a>
<h5>
<a name="boost_typetraits.background.h3"></a>
<span class="phrase"><a name="boost_typetraits.background.was_it_worth_it_"></a></span><a class="link" href="background.html#boost_typetraits.background.was_it_worth_it_">Was
it worth it?</a>
</h5>
<p>
It has often been repeated in these columns that "premature optimization
@ -265,12 +267,12 @@
comparison between algorithms becomes difficult. However, perhaps we can add
a couple of caveats to the premature optimization rule:
</p>
<div class="itemizedlist"><ul type="disc">
<li>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
If you use the right algorithm for the job in the first place then optimization
will not be required; in some cases, memcpy is the right algorithm.
</li>
<li>
<li class="listitem">
If a component is going to be reused in many places by many people then
optimizations may well be worthwhile where they would not be so for a single
case - in other words, the likelihood that the optimization will be absolutely
@ -379,9 +381,10 @@
</tbody>
</table></div>
</div>
<br class="table-break"><a name="boost_typetraits.background.pair_of_references"></a><h5>
<a name="id1014691"></a>
<a class="link" href="background.html#boost_typetraits.background.pair_of_references">Pair of References</a>
<br class="table-break"><h5>
<a name="boost_typetraits.background.h4"></a>
<span class="phrase"><a name="boost_typetraits.background.pair_of_references"></a></span><a class="link" href="background.html#boost_typetraits.background.pair_of_references">Pair
of References</a>
</h5>
<p>
The optimized copy example shows how type traits may be used to perform optimization
@ -396,8 +399,8 @@
the comparison operators, default constructor, and template copy constructor
for simplicity:
</p>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T1</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">T2</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <span class="identifier">pair</span>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T1</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">T2</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <span class="identifier">pair</span>
<span class="special">{</span>
<span class="keyword">typedef</span> <span class="identifier">T1</span> <span class="identifier">first_type</span><span class="special">;</span>
<span class="keyword">typedef</span> <span class="identifier">T2</span> <span class="identifier">second_type</span><span class="special">;</span>
@ -567,8 +570,8 @@
that can contain non-reference types, reference types, and constant reference
types:
</p>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T1</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">T2</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <span class="identifier">pair</span>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T1</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">T2</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <span class="identifier">pair</span>
<span class="special">{</span>
<span class="keyword">typedef</span> <span class="identifier">T1</span> <span class="identifier">first_type</span><span class="special">;</span>
<span class="keyword">typedef</span> <span class="identifier">T2</span> <span class="identifier">second_type</span><span class="special">;</span>
@ -597,9 +600,9 @@
partial specialization to the type traits classes, resulting in code that is
easier to maintain and easier to understand.
</p>
<a name="boost_typetraits.background.conclusion"></a><h5>
<a name="id1015535"></a>
<a class="link" href="background.html#boost_typetraits.background.conclusion">Conclusion</a>
<h5>
<a name="boost_typetraits.background.h5"></a>
<span class="phrase"><a name="boost_typetraits.background.conclusion"></a></span><a class="link" href="background.html#boost_typetraits.background.conclusion">Conclusion</a>
</h5>
<p>
We hope that in this article we have been able to give you some idea of what
@ -610,56 +613,56 @@
does not have to sink to the lowest common denominator, and that templates
can be optimal as well as generic.
</p>
<a name="boost_typetraits.background.acknowledgements"></a><h5>
<a name="id1015552"></a>
<a class="link" href="background.html#boost_typetraits.background.acknowledgements">Acknowledgements</a>
<h5>
<a name="boost_typetraits.background.h6"></a>
<span class="phrase"><a name="boost_typetraits.background.acknowledgements"></a></span><a class="link" href="background.html#boost_typetraits.background.acknowledgements">Acknowledgements</a>
</h5>
<p>
The authors would like to thank Beman Dawes and Howard Hinnant for their helpful
comments when preparing this article.
</p>
<a name="boost_typetraits.background._anchor_id__background_references____references"></a><h5>
<a name="id1015569"></a>
<a class="link" href="background.html#boost_typetraits.background._anchor_id__background_references____references"><a name="background.references"></a> References</a>
<h5>
<a name="boost_typetraits.background.h7"></a>
<span class="phrase"><a name="boost_typetraits.background._anchor_id__background_references___references"></a></span><a class="link" href="background.html#boost_typetraits.background._anchor_id__background_references___references">References</a>
</h5>
<div class="orderedlist"><ol type="1">
<li>
<div class="orderedlist"><ol class="orderedlist" type="1">
<li class="listitem">
Nathan C. Myers, C++ Report, June 1995.
</li>
<li>
<li class="listitem">
The type traits library is based upon contributions by Steve Cleary, Beman
Dawes, Howard Hinnant and John Maddock: it can be found at www.boost.org.
</li>
<li>
<li class="listitem">
A scalar type is an arithmetic type (i.e. a built-in integer or floating
point type), an enumeration type, a pointer, a pointer to member, or a
const- or volatile-qualified version of one of these types.
</li>
<li>
<li class="listitem">
This quote is from Donald Knuth, ACM Computing Surveys, December 1974,
pg 268.
</li>
<li>
<li class="listitem">
The test code is available as part of the boost utility library (see algo_opt_examples.cpp),
the code was compiled with gcc 2.95 with all optimisations turned on, tests
were conducted on a 400MHz Pentium II machine running Microsoft Windows
98.
</li>
<li>
<li class="listitem">
John Maddock and Howard Hinnant have submitted a "compressed_pair"
library to Boost, which uses a technique similar to the one described here
to hold references. Their pair also uses type traits to determine if any
of the types are empty, and will derive instead of contain to conserve
space -- hence the name "compressed".
</li>
<li>
<li class="listitem">
This is actually an issue with the C++ Core Language Working Group (issue
#106), submitted by Bjarne Stroustrup. The tentative resolution is to allow
a "reference to a reference to T" to mean the same thing as a
"reference to T", but only in template instantiation, in a method
similar to multiple cv-qualifiers.
</li>
<li>
<li class="listitem">
For those of you who are wondering why this shouldn't be const-qualified,
remember that references are always implicitly constant (for example, you
can't re-assign a reference). Remember also that "const T &amp;"
@ -670,10 +673,11 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>

View File

@ -1,10 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Type Traits by Category</title>
<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="prev" href="background.html" title="Background and Tutorial">
@ -23,7 +22,7 @@
<div class="spirit-nav">
<a accesskey="p" href="background.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="category/value_traits.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="boost_typetraits.category"></a><a class="link" href="category.html" title="Type Traits by Category">Type Traits by Category</a>
</h2></div></div></div>
@ -37,6 +36,8 @@
Type Properties</a></span></dt>
<dt><span class="section"><a href="category/value_traits/relate.html">Relationships
Between Two Types</a></span></dt>
<dt><span class="section"><a href="category/value_traits/operators.html">Operator
Type Traits</a></span></dt>
</dl></dd>
<dt><span class="section"><a href="category/transform.html">Type Traits that
Transform One Type to Another</a></span></dt>
@ -48,10 +49,11 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>

View File

@ -1,10 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Synthesizing Types with Specific Alignments</title>
<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../category.html" title="Type Traits by Category">
<link rel="prev" href="transform.html" title="Type Traits that Transform One Type to Another">
@ -23,7 +22,7 @@
<div class="spirit-nav">
<a accesskey="p" href="transform.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../category.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="function.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_typetraits.category.alignment"></a><a class="link" href="alignment.html" title="Synthesizing Types with Specific Alignments">Synthesizing Types
with Specific Alignments</a>
@ -46,10 +45,11 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>

View File

@ -1,10 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Decomposing Function Types</title>
<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../category.html" title="Type Traits by Category">
<link rel="prev" href="alignment.html" title="Synthesizing Types with Specific Alignments">
@ -23,7 +22,7 @@
<div class="spirit-nav">
<a accesskey="p" href="alignment.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../category.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../user_defined.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_typetraits.category.function"></a><a class="link" href="function.html" title="Decomposing Function Types">Decomposing Function
Types</a>
@ -43,10 +42,11 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>

View File

@ -1,13 +1,12 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Type Traits that Transform One Type to Another</title>
<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../category.html" title="Type Traits by Category">
<link rel="prev" href="value_traits/relate.html" title="Relationships Between Two Types">
<link rel="prev" href="value_traits/operators.html" title="Operator Type Traits">
<link rel="next" href="alignment.html" title="Synthesizing Types with Specific Alignments">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@ -21,9 +20,9 @@
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="value_traits/relate.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../category.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="alignment.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
<a accesskey="p" href="value_traits/operators.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../category.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="alignment.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_typetraits.category.transform"></a><a class="link" href="transform.html" title="Type Traits that Transform One Type to Another">Type Traits that
Transform One Type to Another</a>
@ -64,6 +63,9 @@
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../reference/common_type.html" title="common_type">common_type</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../reference/copy_cv.html" title="copy_cv">copy_cv</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../reference/decay.html" title="decay">decay</a><span class="special">;</span>
@ -102,70 +104,18 @@
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../reference/remove_volatile.html" title="remove_volatile">remove_volatile</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../reference/type_identity.html" title="type_identity">type_identity</a><span class="special">;</span>
</pre>
<a name="boost_typetraits.category.transform.broken_compiler_workarounds_"></a><h5>
<a name="id1020176"></a>
<a class="link" href="transform.html#boost_typetraits.category.transform.broken_compiler_workarounds_">Broken
Compiler Workarounds:</a>
</h5>
<p>
For all of these templates support for partial specialization of class templates
is required to correctly implement the transformation. On the other hand,
practice shows that many of the templates from this category are very useful,
and often essential for implementing some generic libraries. Lack of these
templates is often one of the major limiting factors in porting those libraries
to compilers that do not yet support this language feature. As some of these
compilers are going to be around for a while, and at least one of them is
very wide-spread, it was decided that the library should provide workarounds
where possible.
</p>
<p>
The basic idea behind the workaround is to manually define full specializations
of all type transformation templates for all fundamental types, and all their
1st and 2nd rank cv-[un]qualified derivative pointer types, and to provide
a user-level macro that will define all the explicit specializations needed
for any user-defined type T.
</p>
<p>
The first part guarantees the successful compilation of something like this:
</p>
<pre class="programlisting"><span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">((</span><span class="identifier">is_same</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">,</span> <span class="identifier">remove_reference</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&amp;&gt;::</span><span class="identifier">type</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">));</span>
<span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">((</span><span class="identifier">is_same</span><span class="special">&lt;</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">,</span> <span class="identifier">remove_reference</span><span class="special">&lt;</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">&amp;&gt;::</span><span class="identifier">type</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">));</span>
<span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">((</span><span class="identifier">is_same</span><span class="special">&lt;</span><span class="keyword">char</span> <span class="keyword">volatile</span><span class="special">,</span> <span class="identifier">remove_reference</span><span class="special">&lt;</span><span class="keyword">char</span> <span class="keyword">volatile</span><span class="special">&amp;&gt;::</span><span class="identifier">type</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">));</span>
<span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">((</span><span class="identifier">is_same</span><span class="special">&lt;</span><span class="keyword">char</span> <span class="keyword">const</span> <span class="keyword">volatile</span><span class="special">,</span> <span class="identifier">remove_reference</span><span class="special">&lt;</span><span class="keyword">char</span> <span class="keyword">const</span> <span class="keyword">volatile</span><span class="special">&amp;&gt;::</span><span class="identifier">type</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">));</span>
<span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">((</span><span class="identifier">is_same</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">*,</span> <span class="identifier">remove_reference</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">*&amp;&gt;::</span><span class="identifier">type</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">));</span>
<span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">((</span><span class="identifier">is_same</span><span class="special">&lt;</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*,</span> <span class="identifier">remove_reference</span><span class="special">&lt;</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*&amp;&gt;::</span><span class="identifier">type</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">));</span>
<span class="special">...</span>
<span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">((</span><span class="identifier">is_same</span><span class="special">&lt;</span><span class="keyword">char</span> <span class="keyword">const</span> <span class="keyword">volatile</span><span class="special">*</span> <span class="keyword">const</span> <span class="keyword">volatile</span><span class="special">*</span> <span class="keyword">const</span> <span class="keyword">volatile</span><span class="special">,</span> <span class="identifier">remove_reference</span><span class="special">&lt;</span><span class="keyword">char</span> <span class="keyword">const</span> <span class="keyword">volatile</span><span class="special">*</span> <span class="keyword">const</span> <span class="keyword">volatile</span><span class="special">*</span> <span class="keyword">const</span> <span class="keyword">volatile</span><span class="special">&amp;&gt;::</span><span class="identifier">type</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">));</span>
</pre>
<p>
and the second part provides the library's users with a mechanism to make
the above code work not only for <code class="computeroutput"><span class="keyword">char</span></code>,
<code class="computeroutput"><span class="keyword">int</span></code> or other built-in type,
but for their own types as well:
</p>
<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">myspace</span><span class="special">{</span>
<span class="keyword">struct</span> <span class="identifier">MyClass</span> <span class="special">{};</span>
<span class="special">}</span>
<span class="comment">// declare this at global scope:
</span><span class="identifier">BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION</span><span class="special">(</span><span class="identifier">myspace</span><span class="special">::</span><span class="identifier">MyClass</span><span class="special">)</span>
<span class="comment">// transformations on myspace::MyClass now work:
</span><span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">((</span><span class="identifier">is_same</span><span class="special">&lt;</span><span class="identifier">myspace</span><span class="special">::</span><span class="identifier">MyClass</span><span class="special">,</span> <span class="identifier">remove_reference</span><span class="special">&lt;</span><span class="identifier">myspace</span><span class="special">::</span><span class="identifier">MyClass</span><span class="special">&amp;&gt;::</span><span class="identifier">type</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">));</span>
<span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">((</span><span class="identifier">is_same</span><span class="special">&lt;</span><span class="identifier">myspace</span><span class="special">::</span><span class="identifier">MyClass</span><span class="special">,</span> <span class="identifier">remove_const</span><span class="special">&lt;</span><span class="identifier">myspace</span><span class="special">::</span><span class="identifier">MyClass</span> <span class="keyword">const</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">));</span>
<span class="comment">// etc.
</span></pre>
<p>
Note that the macro BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION evaluates
to nothing on those compilers that <span class="bold"><strong>do</strong></span> support
partial specialization.
</p>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
@ -173,7 +123,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="value_traits/relate.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../category.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="alignment.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
<a accesskey="p" href="value_traits/operators.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../category.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="alignment.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@ -1,10 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Type Traits that Describe the Properties of a Type</title>
<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../category.html" title="Type Traits by Category">
<link rel="prev" href="../category.html" title="Type Traits by Category">
@ -23,7 +22,7 @@
<div class="spirit-nav">
<a accesskey="p" href="../category.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../category.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="value_traits/primary.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_typetraits.category.value_traits"></a><a class="link" href="value_traits.html" title="Type Traits that Describe the Properties of a Type">Type Traits that
Describe the Properties of a Type</a>
@ -35,6 +34,8 @@
Type Properties</a></span></dt>
<dt><span class="section"><a href="value_traits/relate.html">Relationships
Between Two Types</a></span></dt>
<dt><span class="section"><a href="value_traits/operators.html">Operator
Type Traits</a></span></dt>
</dl></div>
<p>
These traits are all <span class="emphasis"><em>value traits</em></span>, which is to say the
@ -49,10 +50,11 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Categorizing a Type</title>
<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../../../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../value_traits.html" title="Type Traits that Describe the Properties of a Type">
<link rel="prev" href="../value_traits.html" title="Type Traits that Describe the Properties of a Type">
@ -23,7 +22,7 @@
<div class="spirit-nav">
<a accesskey="p" href="../value_traits.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../value_traits.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="properties.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="boost_typetraits.category.value_traits.primary"></a><a class="link" href="primary.html" title="Categorizing a Type">Categorizing
a Type</a>
@ -51,43 +50,43 @@
</p>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_array.html" title="is_array">is_array</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_class.html" title="is_class">is_class</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_complex.html" title="is_complex">is_complex</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_enum.html" title="is_enum">is_enum</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_floating_point.html" title="is_floating_point">is_floating_point</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_function.html" title="is_function">is_function</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_integral.html" title="is_integral">is_integral</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_member_function_pointer.html" title="is_member_function_pointer">is_member_function_pointer</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_member_object_pointer.html" title="is_member_object_pointer">is_member_object_pointer</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_pointer.html" title="is_pointer">is_pointer</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_lvalue_reference.html" title="is_lvalue_reference">is_lvalue_reference</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_rvalue_reference.html" title="is_rvalue_reference">is_rvalue_reference</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_union.html" title="is_union">is_union</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_void.html" title="is_void">is_void</a><span class="special">;</span>
</pre>
@ -113,17 +112,18 @@
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_reference.html" title="is_reference">is_reference</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_scalar.html" title="is_scalar">is_scalar</a><span class="special">;</span>
</pre>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>

View File

@ -1,10 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>General Type Properties</title>
<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../../../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../value_traits.html" title="Type Traits that Describe the Properties of a Type">
<link rel="prev" href="primary.html" title="Categorizing a Type">
@ -23,7 +22,7 @@
<div class="spirit-nav">
<a accesskey="p" href="primary.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../value_traits.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="relate.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="boost_typetraits.category.value_traits.properties"></a><a class="link" href="properties.html" title="General Type Properties">General
Type Properties</a>
@ -55,6 +54,9 @@
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/has_nothrow_copy.html" title="has_nothrow_copy">has_nothrow_copy_constructor</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/has_nothrow_destruct.html" title="has_nothrow_destructor">has_nothrow_destructor</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/has_trivial_assign.html" title="has_trivial_assign">has_trivial_assign</a><span class="special">;</span>
@ -79,12 +81,33 @@
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_abstract.html" title="is_abstract">is_abstract</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_assignable.html" title="is_assignable">is_assignable</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_copy_constructible.html" title="is_copy_constructible">is_copy_constructible</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_copy_assignable.html" title="is_copy_assignable">is_copy_assignable</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_constructible.html" title="is_constructible">is_constructible</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_default_constructible.html" title="is_default_constructible">is_default_constructible</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_destructible.html" title="is_destructible">is_destructible</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_const.html" title="is_const">is_const</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_empty.html" title="is_empty">is_empty</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_final.html" title="is_final">is_final</a><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <a class="link" href="../../reference/is_stateless.html" title="is_stateless">is_stateless</a><span class="special">;</span>
@ -112,10 +135,11 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>

View File

@ -1,14 +1,13 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Relationships Between Two Types</title>
<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../../../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../value_traits.html" title="Type Traits that Describe the Properties of a Type">
<link rel="prev" href="properties.html" title="General Type Properties">
<link rel="next" href="../transform.html" title="Type Traits that Transform One Type to Another">
<link rel="next" href="operators.html" title="Operator Type Traits">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
@ -21,9 +20,9 @@
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="properties.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../value_traits.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../transform.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
<a accesskey="p" href="properties.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../value_traits.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="operators.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="boost_typetraits.category.value_traits.relate"></a><a class="link" href="relate.html" title="Relationships Between Two Types">Relationships
Between Two Types</a>
@ -50,10 +49,11 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
@ -61,7 +61,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="properties.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../value_traits.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../transform.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
<a accesskey="p" href="properties.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../value_traits.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="operators.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@ -1,10 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Credits</title>
<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="prev" href="history.html" title="History">
@ -23,7 +22,7 @@
<div class="spirit-nav">
<a accesskey="p" href="history.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../index/s11.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="boost_typetraits.credits"></a><a class="link" href="credits.html" title="Credits">Credits</a>
</h2></div></div></div>
@ -40,7 +39,7 @@
This version of type traits library is based on contributions by Adobe Systems
Inc, David Abrahams, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Thorsten Ottosen, Robert
Ramey and Jeremy Siek.
Ramey, Jeremy Siek and Antony Polukhin.
</p>
<p>
Mat Marcus and Jesse Jones invented, and <a href="http://opensource.adobe.com/project4/project.shtml" target="_top">published
@ -63,10 +62,11 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>

View File

@ -1,10 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Examples</title>
<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="prev" href="mpl.html" title="MPL Interoperability">
@ -23,7 +22,7 @@
<div class="spirit-nav">
<a accesskey="p" href="mpl.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="examples/copy.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="boost_typetraits.examples"></a><a class="link" href="examples.html" title="Examples">Examples</a>
</h2></div></div></div>
@ -44,10 +43,11 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>

View File

@ -1,10 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>An Optimized Version of std::copy</title>
<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../examples.html" title="Examples">
<link rel="prev" href="../examples.html" title="Examples">
@ -23,7 +22,7 @@
<div class="spirit-nav">
<a accesskey="p" href="../examples.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="fill.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_typetraits.examples.copy"></a><a class="link" href="copy.html" title="An Optimized Version of std::copy">An Optimized Version
of std::copy</a>
@ -34,12 +33,12 @@
to determine whether to use <code class="computeroutput"><span class="identifier">memcpy</span></code>
to optimise the copy operation (see <a href="../../../../examples/copy_example.cpp" target="_top">copy_example.cpp</a>):
</p>
<pre class="programlisting"><span class="comment">//
</span><span class="comment">// opt::copy
</span><span class="comment">// same semantics as std::copy
</span><span class="comment">// calls memcpy where appropriate.
</span><span class="comment">//
</span>
<pre class="programlisting"><span class="comment">//</span>
<span class="comment">// opt::copy</span>
<span class="comment">// same semantics as std::copy</span>
<span class="comment">// calls memcpy where appropriate.</span>
<span class="comment">//</span>
<span class="keyword">namespace</span> <span class="identifier">detail</span><span class="special">{</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">I1</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">I2</span><span class="special">,</span> <span class="keyword">bool</span> <span class="identifier">b</span><span class="special">&gt;</span>
@ -67,22 +66,23 @@
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">I1</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">I2</span><span class="special">&gt;</span>
<span class="keyword">inline</span> <span class="identifier">I2</span> <span class="identifier">copy</span><span class="special">(</span><span class="identifier">I1</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">I1</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">I2</span> <span class="identifier">out</span><span class="special">)</span>
<span class="special">{</span>
<span class="comment">//
</span> <span class="comment">// We can copy with memcpy if T has a trivial assignment operator,
</span> <span class="comment">// and if the iterator arguments are actually pointers (this last
</span> <span class="comment">// requirement we detect with overload resolution):
</span> <span class="comment">//
</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">iterator_traits</span><span class="special">&lt;</span><span class="identifier">I1</span><span class="special">&gt;::</span><span class="identifier">value_type</span> <span class="identifier">value_type</span><span class="special">;</span>
<span class="comment">//</span>
<span class="comment">// We can copy with memcpy if T has a trivial assignment operator,</span>
<span class="comment">// and if the iterator arguments are actually pointers (this last</span>
<span class="comment">// requirement we detect with overload resolution):</span>
<span class="comment">//</span>
<span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">iterator_traits</span><span class="special">&lt;</span><span class="identifier">I1</span><span class="special">&gt;::</span><span class="identifier">value_type</span> <span class="identifier">value_type</span><span class="special">;</span>
<span class="keyword">return</span> <span class="identifier">detail</span><span class="special">::</span><span class="identifier">copy_imp</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">out</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><a class="link" href="../reference/has_trivial_assign.html" title="has_trivial_assign">has_trivial_assign</a><span class="special">&lt;</span><span class="identifier">value_type</span><span class="special">&gt;());</span>
<span class="special">}</span>
</pre>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>

View File

@ -1,10 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>An Example that Omits Destructor Calls For Types with Trivial Destructors</title>
<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../examples.html" title="Examples">
<link rel="prev" href="fill.html" title="An Optimised Version of std::fill">
@ -23,7 +22,7 @@
<div class="spirit-nav">
<a accesskey="p" href="fill.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="iter.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_typetraits.examples.destruct"></a><a class="link" href="destruct.html" title="An Example that Omits Destructor Calls For Types with Trivial Destructors">An Example that Omits
Destructor Calls For Types with Trivial Destructors</a>
@ -32,12 +31,12 @@
Demonstrates a simple algorithm that uses <code class="computeroutput"><span class="identifier">__has_trivial_destruct</span></code>
to determine whether to destructors need to be called (see <a href="../../../../examples/trivial_destructor_example.cpp" target="_top">trivial_destructor_example.cpp</a>):
</p>
<pre class="programlisting"><span class="comment">//
</span><span class="comment">// algorithm destroy_array:
</span><span class="comment">// The reverse of std::unitialized_copy, takes a block of
</span><span class="comment">// initialized memory and calls destructors on all objects therein.
</span><span class="comment">//
</span>
<pre class="programlisting"><span class="comment">//</span>
<span class="comment">// algorithm destroy_array:</span>
<span class="comment">// The reverse of std::unitialized_copy, takes a block of</span>
<span class="comment">// initialized memory and calls destructors on all objects therein.</span>
<span class="comment">//</span>
<span class="keyword">namespace</span> <span class="identifier">detail</span><span class="special">{</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
@ -55,8 +54,8 @@
<span class="special">{</span>
<span class="special">}</span>
<span class="special">}</span> <span class="comment">// namespace detail
</span>
<span class="special">}</span> <span class="comment">// namespace detail</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">inline</span> <span class="keyword">void</span> <span class="identifier">destroy_array</span><span class="special">(</span><span class="identifier">T</span><span class="special">*</span> <span class="identifier">p1</span><span class="special">,</span> <span class="identifier">T</span><span class="special">*</span> <span class="identifier">p2</span><span class="special">)</span>
<span class="special">{</span>
@ -66,10 +65,11 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>

View File

@ -1,10 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>An Optimised Version of std::fill</title>
<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../examples.html" title="Examples">
<link rel="prev" href="copy.html" title="An Optimized Version of std::copy">
@ -23,7 +22,7 @@
<div class="spirit-nav">
<a accesskey="p" href="copy.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="destruct.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_typetraits.examples.fill"></a><a class="link" href="fill.html" title="An Optimised Version of std::fill">An Optimised Version
of std::fill</a>
@ -34,11 +33,11 @@
to determine whether to use <code class="computeroutput"><span class="identifier">memset</span></code>
to optimise the fill operation (see <a href="../../../../examples/fill_example.cpp" target="_top">fill_example.cpp</a>):
</p>
<pre class="programlisting"><span class="comment">//
</span><span class="comment">// fill
</span><span class="comment">// same as std::fill, but uses memset where appropriate
</span><span class="comment">//
</span><span class="keyword">namespace</span> <span class="identifier">detail</span><span class="special">{</span>
<pre class="programlisting"><span class="comment">//</span>
<span class="comment">// fill</span>
<span class="comment">// same as std::fill, but uses memset where appropriate</span>
<span class="comment">//</span>
<span class="keyword">namespace</span> <span class="identifier">detail</span><span class="special">{</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">I</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">bool</span> <span class="identifier">b</span><span class="special">&gt;</span>
<span class="keyword">void</span> <span class="identifier">do_fill</span><span class="special">(</span><span class="identifier">I</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">I</span> <span class="identifier">last</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">val</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">boost</span><span class="special">::</span><a class="link" href="../reference/integral_constant.html" title="integral_constant">integral_constant</a><span class="special">&lt;</span><span class="keyword">bool</span><span class="special">,</span> <span class="identifier">b</span><span class="special">&gt;&amp;)</span>
@ -61,11 +60,11 @@
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">I</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">inline</span> <span class="keyword">void</span> <span class="identifier">fill</span><span class="special">(</span><span class="identifier">I</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">I</span> <span class="identifier">last</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">val</span><span class="special">)</span>
<span class="special">{</span>
<span class="comment">//
</span> <span class="comment">// We can do an optimised fill if T has a trivial assignment
</span> <span class="comment">// operator and if it's size is one:
</span> <span class="comment">//
</span> <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><a class="link" href="../reference/integral_constant.html" title="integral_constant">integral_constant</a><span class="special">&lt;</span><span class="keyword">bool</span><span class="special">,</span>
<span class="comment">//</span>
<span class="comment">// We can do an optimised fill if T has a trivial assignment </span>
<span class="comment">// operator and if it's size is one:</span>
<span class="comment">//</span>
<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><a class="link" href="../reference/integral_constant.html" title="integral_constant">integral_constant</a><span class="special">&lt;</span><span class="keyword">bool</span><span class="special">,</span>
<span class="special">::</span><span class="identifier">boost</span><span class="special">::</span><a class="link" href="../reference/has_trivial_assign.html" title="has_trivial_assign">has_trivial_assign</a><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span> <span class="special">&amp;&amp;</span> <span class="special">(</span><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="special">==</span> <span class="number">1</span><span class="special">)&gt;</span> <span class="identifier">truth_type</span><span class="special">;</span>
<span class="identifier">detail</span><span class="special">::</span><span class="identifier">do_fill</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">val</span><span class="special">,</span> <span class="identifier">truth_type</span><span class="special">());</span>
<span class="special">}</span>
@ -73,10 +72,11 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>

View File

@ -1,10 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Improving std::min with common_type</title>
<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../examples.html" title="Examples">
<link rel="prev" href="to_double.html" title="Convert Numeric Types and Enums to double">
@ -23,7 +22,7 @@
<div class="spirit-nav">
<a accesskey="p" href="to_double.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../reference.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_typetraits.examples.improved_min"></a><a class="link" href="improved_min.html" title="Improving std::min with common_type">Improving std::min
with common_type</a>
@ -32,7 +31,7 @@
An improved <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">min</span></code> function could be written like this:
</p>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">U</span><span class="special">&gt;</span>
<span class="keyword">typename</span> <a class="link" href="../reference/common_type.html" title="common_type">common_type</a><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">U</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">min</span><span class="special">(</span><span class="identifier">T</span> <span class="identifier">t</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">u</span><span class="special">)</span>
<span class="keyword">typename</span> <a class="link" href="../reference/common_type.html" title="common_type">common_type</a><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">U</span><span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">min</span><span class="special">(</span><span class="identifier">T</span> <span class="identifier">t</span><span class="special">,</span> <span class="identifier">U</span> <span class="identifier">u</span><span class="special">)</span>
<span class="special">{</span>
<span class="keyword">return</span> <span class="identifier">t</span> <span class="special">&lt;</span> <span class="identifier">u</span> <span class="special">?</span> <span class="identifier">t</span> <span class="special">:</span> <span class="identifier">u</span><span class="special">;</span>
<span class="special">}</span>
@ -48,10 +47,11 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>

View File

@ -1,10 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>An improved Version of std::iter_swap</title>
<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../examples.html" title="Examples">
<link rel="prev" href="destruct.html" title="An Example that Omits Destructor Calls For Types with Trivial Destructors">
@ -23,26 +22,26 @@
<div class="spirit-nav">
<a accesskey="p" href="destruct.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="to_double.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_typetraits.examples.iter"></a><a class="link" href="iter.html" title="An improved Version of std::iter_swap">An improved Version of
std::iter_swap</a>
</h3></div></div></div>
<p>
Demonstrates a version of <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">iter_swap</span></code>
that use type traits to determine whether an it's arguments are proxying
iterators or not, if they're not then it just does a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">swap</span></code>
that use type traits to determine whether an it's arguments are proxy iterators
or not, if they're not then it just does a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">swap</span></code>
of it's dereferenced arguments (the same as <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">iter_swap</span></code>
does), however if they are proxying iterators then takes special care over
the swap to ensure that the algorithm works correctly for both proxying iterators,
does), however if they are proxy iterators then takes special care over the
swap to ensure that the algorithm works correctly for both proxy iterators,
and even iterators of different types (see <a href="../../../../examples/iter_swap_example.cpp" target="_top">iter_swap_example.cpp</a>):
</p>
<pre class="programlisting"><span class="comment">//
</span><span class="comment">// iter_swap:
</span><span class="comment">// tests whether iterator is a proxying iterator or not, and
</span><span class="comment">// uses optimal form accordingly:
</span><span class="comment">//
</span><span class="keyword">namespace</span> <span class="identifier">detail</span><span class="special">{</span>
<pre class="programlisting"><span class="comment">//</span>
<span class="comment">// iter_swap:</span>
<span class="comment">// tests whether iterator is a proxy iterator or not, and</span>
<span class="comment">// uses optimal form accordingly:</span>
<span class="comment">//</span>
<span class="keyword">namespace</span> <span class="identifier">detail</span><span class="special">{</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">I</span><span class="special">&gt;</span>
<span class="keyword">static</span> <span class="keyword">void</span> <span class="identifier">do_swap</span><span class="special">(</span><span class="identifier">I</span> <span class="identifier">one</span><span class="special">,</span> <span class="identifier">I</span> <span class="identifier">two</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">boost</span><span class="special">::</span><a class="link" href="../reference/integral_constant.html" title="integral_constant">false_type</a><span class="special">&amp;)</span>
@ -64,11 +63,11 @@
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">I1</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">I2</span><span class="special">&gt;</span>
<span class="keyword">inline</span> <span class="keyword">void</span> <span class="identifier">iter_swap</span><span class="special">(</span><span class="identifier">I1</span> <span class="identifier">one</span><span class="special">,</span> <span class="identifier">I2</span> <span class="identifier">two</span><span class="special">)</span>
<span class="special">{</span>
<span class="comment">//
</span> <span class="comment">// See is both arguments are non-proxying iterators,
</span> <span class="comment">// and if both iterator the same type:
</span> <span class="comment">//
</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">iterator_traits</span><span class="special">&lt;</span><span class="identifier">I1</span><span class="special">&gt;::</span><span class="identifier">reference</span> <span class="identifier">r1_t</span><span class="special">;</span>
<span class="comment">//</span>
<span class="comment">// See is both arguments are non-proxying iterators, </span>
<span class="comment">// and if both iterator the same type:</span>
<span class="comment">//</span>
<span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">iterator_traits</span><span class="special">&lt;</span><span class="identifier">I1</span><span class="special">&gt;::</span><span class="identifier">reference</span> <span class="identifier">r1_t</span><span class="special">;</span>
<span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">iterator_traits</span><span class="special">&lt;</span><span class="identifier">I2</span><span class="special">&gt;::</span><span class="identifier">reference</span> <span class="identifier">r2_t</span><span class="special">;</span>
<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><a class="link" href="../reference/integral_constant.html" title="integral_constant">integral_constant</a><span class="special">&lt;</span><span class="keyword">bool</span><span class="special">,</span>
@ -82,10 +81,11 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>

View File

@ -1,10 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Convert Numeric Types and Enums to double</title>
<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../examples.html" title="Examples">
<link rel="prev" href="iter.html" title="An improved Version of std::iter_swap">
@ -23,7 +22,7 @@
<div class="spirit-nav">
<a accesskey="p" href="iter.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="improved_min.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_typetraits.examples.to_double"></a><a class="link" href="to_double.html" title="Convert Numeric Types and Enums to double">Convert Numeric
Types and Enums to double</a>
@ -42,10 +41,11 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>

View File

@ -1,10 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>History</title>
<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="prev" href="reference/type_with_alignment.html" title="type_with_alignment">
@ -23,56 +22,163 @@
<div class="spirit-nav">
<a accesskey="p" href="reference/type_with_alignment.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="credits.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="boost_typetraits.history"></a><a class="link" href="history.html" title="History">History</a>
</h2></div></div></div>
<a name="boost_typetraits.history.boost_1_45_0"></a><h5>
<a name="id1077080"></a>
<a class="link" href="history.html#boost_typetraits.history.boost_1_45_0">Boost 1.45.0</a>
<h5>
<a name="boost_typetraits.history.h0"></a>
<span class="phrase"><a name="boost_typetraits.history.boost_1_64_0"></a></span><a class="link" href="history.html#boost_typetraits.history.boost_1_64_0">Boost
1.64.0</a>
</h5>
<div class="itemizedlist"><ul type="disc">
<li>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
Added new trait <a class="link" href="reference/make_void.html" title="make_void">make_void</a>.
</li></ul></div>
<h5>
<a name="boost_typetraits.history.h1"></a>
<span class="phrase"><a name="boost_typetraits.history.boost_1_60_0"></a></span><a class="link" href="history.html#boost_typetraits.history.boost_1_60_0">Boost
1.60.0</a>
</h5>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
Refactored traits to depend only on Boost.Config. Greatly simplified code
to improve readability and remove workarounds for old compilers no longer
supported.
</li>
<li class="listitem">
Fix <a class="link" href="reference/decay.html" title="decay">decay</a> to follow
C++11 semantics, see <a href="https://svn.boost.org/trac/boost/ticket/7760" target="_top">#7760</a>.
</li>
<li class="listitem">
Added a number of new traits <a class="link" href="reference/is_assignable.html" title="is_assignable">is_assignable</a>,
<a class="link" href="reference/is_default_constructible.html" title="is_default_constructible">is_default_constructible</a>,
<a class="link" href="reference/is_constructible.html" title="is_constructible">is_constructible</a>
and <a class="link" href="reference/is_destructible.html" title="is_destructible">is_destructible</a>
required to fix bugs in a number of other traits, see for example <a href="https://svn.boost.org/trac/boost/ticket/7760" target="_top">#11324</a>.
</li>
</ul></div>
<h5>
<a name="boost_typetraits.history.h2"></a>
<span class="phrase"><a name="boost_typetraits.history.boost_1_58_0"></a></span><a class="link" href="history.html#boost_typetraits.history.boost_1_58_0">Boost
1.58.0</a>
</h5>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
Fixed issue with CUDA on Clang compiler see <a href="https://svn.boost.org/trac/boost/ticket/10694" target="_top">#10694</a>.
</li>
<li class="listitem">
Fixed <a class="link" href="reference/is_nothrow_move_assignable.html" title="is_nothrow_move_assignable">is_nothrow_move_assignable</a>
and <a class="link" href="reference/is_nothrow_move_constructible.html" title="is_nothrow_move_constructible">is_nothrow_move_constructible</a>
to work on VC12 and later.
</li>
</ul></div>
<h5>
<a name="boost_typetraits.history.h3"></a>
<span class="phrase"><a name="boost_typetraits.history.boost_1_57_0"></a></span><a class="link" href="history.html#boost_typetraits.history.boost_1_57_0">Boost
1.57.0</a>
</h5>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
Added new traits <a class="link" href="reference/is_copy_assignable.html" title="is_copy_assignable">is_copy_assignable</a>
and <a class="link" href="reference/is_final.html" title="is_final">is_final</a>.
</li>
<li class="listitem">
Misc fixes for newer versions of clang and msvc-14.
</li>
</ul></div>
<h5>
<a name="boost_typetraits.history.h4"></a>
<span class="phrase"><a name="boost_typetraits.history.boost_1_56_0"></a></span><a class="link" href="history.html#boost_typetraits.history.boost_1_56_0">Boost
1.56.0</a>
</h5>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
Fixed issues <a href="https://svn.boost.org/trac/boost/ticket/7317" target="_top">#7317</a>,
<a href="https://svn.boost.org/trac/boost/ticket/9474" target="_top">#9474</a>.
</li></ul></div>
<h5>
<a name="boost_typetraits.history.h5"></a>
<span class="phrase"><a name="boost_typetraits.history.boost_1_55_0"></a></span><a class="link" href="history.html#boost_typetraits.history.boost_1_55_0">Boost
1.55.0</a>
</h5>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
Added new trait <a class="link" href="reference/is_copy_constructible.html" title="is_copy_constructible">is_copy_constructible</a>.
</li></ul></div>
<h5>
<a name="boost_typetraits.history.h6"></a>
<span class="phrase"><a name="boost_typetraits.history.boost_1_54_0"></a></span><a class="link" href="history.html#boost_typetraits.history.boost_1_54_0">Boost
1.54.0</a>
</h5>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
Added new traits <a class="link" href="reference/is_nothrow_move_assignable.html" title="is_nothrow_move_assignable">is_nothrow_move_assignable</a>,
<a class="link" href="reference/is_nothrow_move_constructible.html" title="is_nothrow_move_constructible">is_nothrow_move_constructible</a>,
<a class="link" href="reference/has_trivial_move_assign.html" title="has_trivial_move_assign">has_trivial_move_assign</a>,
<a class="link" href="reference/has_trivial_move_constructor.html" title="has_trivial_move_constructor">has_trivial_move_constructor</a>.
</li></ul></div>
<h5>
<a name="boost_typetraits.history.h7"></a>
<span class="phrase"><a name="boost_typetraits.history.boost_1_47_0"></a></span><a class="link" href="history.html#boost_typetraits.history.boost_1_47_0">Boost
1.47.0</a>
</h5>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
<span class="bold"><strong>Breaking change</strong></span>: changed <a class="link" href="reference/is_convertible.html" title="is_convertible">is_convertible</a>
to C++0x behaviour when possible.
</li>
<li class="listitem">
Fixed issues <a href="https://svn.boost.org/trac/boost/ticket/5271" target="_top">#5271</a>,
<a href="https://svn.boost.org/trac/boost/ticket/4530" target="_top">#4530</a>.
</li>
</ul></div>
<h5>
<a name="boost_typetraits.history.h8"></a>
<span class="phrase"><a name="boost_typetraits.history.boost_1_45_0"></a></span><a class="link" href="history.html#boost_typetraits.history.boost_1_45_0">Boost
1.45.0</a>
</h5>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
Added new traits <a class="link" href="reference/add_rvalue_reference.html" title="add_rvalue_reference">add_rvalue_reference</a>,
<a class="link" href="reference/add_lvalue_reference.html" title="add_lvalue_reference">add_lvalue_reference</a>
and <a class="link" href="reference/common_type.html" title="common_type">common_type</a>.
</li>
<li>
<li class="listitem">
Minor fixes to <a class="link" href="reference/is_signed.html" title="is_signed">is_signed</a>,
<a class="link" href="reference/is_unsigned.html" title="is_unsigned">is_unsigned</a>
and <a class="link" href="reference/is_virtual_base_of.html" title="is_virtual_base_of">is_virtual_base_of</a>.
</li>
</ul></div>
<a name="boost_typetraits.history.boost_1_44_0"></a><h5>
<a name="id1077140"></a>
<a class="link" href="history.html#boost_typetraits.history.boost_1_44_0">Boost 1.44.0</a>
<h5>
<a name="boost_typetraits.history.h9"></a>
<span class="phrase"><a name="boost_typetraits.history.boost_1_44_0"></a></span><a class="link" href="history.html#boost_typetraits.history.boost_1_44_0">Boost
1.44.0</a>
</h5>
<div class="itemizedlist"><ul type="disc">
<li>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
Added support for rvalue references throughout the library, plus two new
traits classes <a class="link" href="reference/is_rvalue_reference.html" title="is_rvalue_reference">is_rvalue_reference</a>
and <a class="link" href="reference/is_lvalue_reference.html" title="is_lvalue_reference">is_lvalue_reference</a>.
Fixes <a href="https://svn.boost.org/trac/boost/ticket/4407" target="_top">#4407</a>
and <a href="https://svn.boost.org/trac/boost/ticket/3804" target="_top">#3804</a>.
</li>
<li>
<li class="listitem">
Fixed ticket <a href="https://svn.boost.org/trac/boost/ticket/3621" target="_top">#3621</a>.
</li>
</ul></div>
<a name="boost_typetraits.history.boost_1_42_0"></a><h5>
<a name="id1077195"></a>
<a class="link" href="history.html#boost_typetraits.history.boost_1_42_0">Boost 1.42.0</a>
<h5>
<a name="boost_typetraits.history.h10"></a>
<span class="phrase"><a name="boost_typetraits.history.boost_1_42_0"></a></span><a class="link" href="history.html#boost_typetraits.history.boost_1_42_0">Boost
1.42.0</a>
</h5>
<div class="itemizedlist"><ul type="disc"><li>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
Fixed issue <a href="https://svn.boost.org/trac/boost/ticket/3704" target="_top">#3704</a>.
</li></ul></div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>

View File

@ -1,10 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Support for Compiler Intrinsics</title>
<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="prev" href="user_defined.html" title="User Defined Specializations">
@ -23,7 +22,7 @@
<div class="spirit-nav">
<a accesskey="p" href="user_defined.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="mpl.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="boost_typetraits.intrinsics"></a><a class="link" href="intrinsics.html" title="Support for Compiler Intrinsics">Support for Compiler Intrinsics</a>
</h2></div></div></div>
@ -31,42 +30,57 @@
There are some traits that can not be implemented within the current C++ language:
to make these traits "just work" with user defined types, some kind
of additional help from the compiler is required. Currently (April 2008) Visual
C++ 8 and 9, GNU GCC 4.3 and MWCW 9 provide the necessary intrinsics, and other
compilers will no doubt follow in due course.
C++ 8 and 9, GNU GCC 4.3 and MWCW 9 provide at least some of the the necessary
intrinsics, and other compilers will no doubt follow in due course.
</p>
<p>
The Following traits classes always need compiler support to do the right thing
for all types (but all have safe fallback positions if this support is unavailable):
</p>
<div class="itemizedlist"><ul type="disc">
<li>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
<a class="link" href="reference/is_final.html" title="is_final">is_final</a>
</li>
<li class="listitem">
<a class="link" href="reference/is_union.html" title="is_union">is_union</a>
</li>
<li>
<li class="listitem">
<a class="link" href="reference/is_pod.html" title="is_pod">is_pod</a>
</li>
<li>
<li class="listitem">
<a class="link" href="reference/is_nothrow_move_assignable.html" title="is_nothrow_move_assignable">is_nothrow_move_assignable</a>
</li>
<li class="listitem">
<a class="link" href="reference/is_nothrow_move_constructible.html" title="is_nothrow_move_constructible">is_nothrow_move_constructible</a>
</li>
<li class="listitem">
<a class="link" href="reference/has_trivial_constructor.html" title="has_trivial_constructor">has_trivial_constructor</a>
</li>
<li>
<li class="listitem">
<a class="link" href="reference/has_trivial_copy.html" title="has_trivial_copy">has_trivial_copy</a>
</li>
<li>
<li class="listitem">
<a class="link" href="reference/has_trivial_move_constructor.html" title="has_trivial_move_constructor">has_trivial_move_constructor</a>
</li>
<li class="listitem">
<a class="link" href="reference/has_trivial_assign.html" title="has_trivial_assign">has_trivial_assign</a>
</li>
<li>
<li class="listitem">
<a class="link" href="reference/has_trivial_move_assign.html" title="has_trivial_move_assign">has_trivial_move_assign</a>
</li>
<li class="listitem">
<a class="link" href="reference/has_trivial_destructor.html" title="has_trivial_destructor">has_trivial_destructor</a>
</li>
<li>
<li class="listitem">
<a class="link" href="reference/has_nothrow_constructor.html" title="has_nothrow_constructor">has_nothrow_constructor</a>
</li>
<li>
<li class="listitem">
<a class="link" href="reference/has_nothrow_copy.html" title="has_nothrow_copy">has_nothrow_copy</a>
</li>
<li>
<li class="listitem">
<a class="link" href="reference/has_nothrow_assign.html" title="has_nothrow_assign">has_nothrow_assign</a>
</li>
<li>
<li class="listitem">
<a class="link" href="reference/has_virtual_destructor.html" title="has_virtual_destructor">has_virtual_destructor</a>
</li>
</ul></div>
@ -75,22 +89,25 @@
although in practice, the implementations do in fact do the right thing on
all the compilers we know about:
</p>
<div class="itemizedlist"><ul type="disc">
<li>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
<a class="link" href="reference/is_empty.html" title="is_empty">is_empty</a>
</li>
<li>
<li class="listitem">
<a class="link" href="reference/is_polymorphic.html" title="is_polymorphic">is_polymorphic</a>
</li>
<li class="listitem">
<a class="link" href="reference/is_virtual_base_of.html" title="is_virtual_base_of">is_virtual_base_of</a>
</li>
</ul></div>
<p>
The following traits classes are dependent on one or more of the above:
</p>
<div class="itemizedlist"><ul type="disc">
<li>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
<a class="link" href="reference/is_class.html" title="is_class">is_class</a>
</li>
<li>
<li class="listitem">
<a class="link" href="reference/is_stateless.html" title="is_stateless">is_stateless</a>
</li>
</ul></div>
@ -100,7 +117,7 @@
of the following macros:
</p>
<div class="table">
<a name="boost_typetraits.intrinsics.macros_for_compiler_intrinsics"></a><p class="title"><b>Table&#160;1.4.&#160;Macros for Compiler Intrinsics</b></p>
<a name="boost_typetraits.intrinsics.macros_for_compiler_intrinsics"></a><p class="title"><b>Table&#160;1.9.&#160;Macros for Compiler Intrinsics</b></p>
<div class="table-contents"><table class="table" summary="Macros for Compiler Intrinsics">
<colgroup>
<col>
@ -109,147 +126,17 @@
<thead><tr>
<th>
<p>
BOOST_IS_UNION(T)
BOOST_ALIGNMENT_OF(T)
</p>
</th>
<th>
<p>
Should evaluate to true if T is a union type
Should evaluate to the alignment requirements of type T
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
BOOST_IS_POD(T)
</p>
</td>
<td>
<p>
Should evaluate to true if T is a POD type
</p>
</td>
</tr>
<tr>
<td>
<p>
BOOST_IS_EMPTY(T)
</p>
</td>
<td>
<p>
Should evaluate to true if T is an empty struct or union
</p>
</td>
</tr>
<tr>
<td>
<p>
BOOST_HAS_TRIVIAL_CONSTRUCTOR(T)
</p>
</td>
<td>
<p>
Should evaluate to true if the default constructor for T is trivial
(i.e. has no effect)
</p>
</td>
</tr>
<tr>
<td>
<p>
BOOST_HAS_TRIVIAL_COPY(T)
</p>
</td>
<td>
<p>
Should evaluate to true if T has a trivial copy constructor (and
can therefore be replaced by a call to memcpy)
</p>
</td>
</tr>
<tr>
<td>
<p>
BOOST_HAS_TRIVIAL_ASSIGN(T)
</p>
</td>
<td>
<p>
Should evaluate to true if T has a trivial assignment operator (and
can therefore be replaced by a call to memcpy)
</p>
</td>
</tr>
<tr>
<td>
<p>
BOOST_HAS_TRIVIAL_DESTRUCTOR(T)
</p>
</td>
<td>
<p>
Should evaluate to true if T has a trivial destructor (i.e. ~T()
has no effect)
</p>
</td>
</tr>
<tr>
<td>
<p>
BOOST_HAS_NOTHROW_CONSTRUCTOR(T)
</p>
</td>
<td>
<p>
Should evaluate to true if <code class="computeroutput"><span class="identifier">T</span>
<span class="identifier">x</span><span class="special">;</span></code>
can not throw
</p>
</td>
</tr>
<tr>
<td>
<p>
BOOST_HAS_NOTHROW_COPY(T)
</p>
</td>
<td>
<p>
Should evaluate to true if <code class="computeroutput"><span class="identifier">T</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span></code> can not throw
</p>
</td>
</tr>
<tr>
<td>
<p>
BOOST_HAS_NOTHROW_ASSIGN(T)
</p>
</td>
<td>
<p>
Should evaluate to true if <code class="computeroutput"><span class="identifier">T</span>
<span class="identifier">t</span><span class="special">,</span>
<span class="identifier">u</span><span class="special">;</span>
<span class="identifier">t</span> <span class="special">=</span>
<span class="identifier">u</span></code> can not throw
</p>
</td>
</tr>
<tr>
<td>
<p>
BOOST_HAS_VIRTUAL_DESTRUCTOR(T)
</p>
</td>
<td>
<p>
Should evaluate to true T has a virtual destructor
</p>
</td>
</tr>
<tr>
<td>
<p>
BOOST_IS_ABSTRACT(T)
@ -298,6 +185,18 @@
</td>
</tr>
<tr>
<td>
<p>
BOOST_IS_EMPTY(T)
</p>
</td>
<td>
<p>
Should evaluate to true if T is an empty struct or union
</p>
</td>
</tr>
<tr>
<td>
<p>
BOOST_IS_ENUM(T)
@ -310,6 +209,43 @@
</td>
</tr>
<tr>
<td>
<p>
BOOST_IS_FINAL(T)
</p>
</td>
<td>
<p>
Should evaluate to true if T is a class type declared with the final
specifier
</p>
</td>
</tr>
<tr>
<td>
<p>
BOOST_IS_NOTHROW_MOVE_ASSIGN(T)
</p>
</td>
<td>
<p>
Should evaluate to true T has a non-throwing move assign operator.
</p>
</td>
</tr>
<tr>
<td>
<p>
BOOST_IS_NOTHROW_MOVE_CONSTRUCT(T)
</p>
</td>
<td>
<p>
Should evaluate to true T has a non-throwing move constructor.
</p>
</td>
</tr>
<tr>
<td>
<p>
BOOST_IS_POLYMORPHIC(T)
@ -324,12 +260,156 @@
<tr>
<td>
<p>
BOOST_ALIGNMENT_OF(T)
BOOST_IS_POD(T)
</p>
</td>
<td>
<p>
Should evaluate to the alignment requirements of type T.
Should evaluate to true if T is a POD type
</p>
</td>
</tr>
<tr>
<td>
<p>
BOOST_IS_UNION(T)
</p>
</td>
<td>
<p>
Should evaluate to true if T is a union type
</p>
</td>
</tr>
<tr>
<td>
<p>
BOOST_HAS_NOTHROW_ASSIGN(T)
</p>
</td>
<td>
<p>
Should evaluate to true if <code class="computeroutput"><span class="identifier">T</span>
<span class="identifier">t</span><span class="special">,</span>
<span class="identifier">u</span><span class="special">;</span>
<span class="identifier">t</span> <span class="special">=</span>
<span class="identifier">u</span></code> can not throw
</p>
</td>
</tr>
<tr>
<td>
<p>
BOOST_HAS_NOTHROW_CONSTRUCTOR(T)
</p>
</td>
<td>
<p>
Should evaluate to true if <code class="computeroutput"><span class="identifier">T</span>
<span class="identifier">x</span><span class="special">;</span></code>
can not throw
</p>
</td>
</tr>
<tr>
<td>
<p>
BOOST_HAS_NOTHROW_COPY(T)
</p>
</td>
<td>
<p>
Should evaluate to true if <code class="computeroutput"><span class="identifier">T</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span></code> can not throw
</p>
</td>
</tr>
<tr>
<td>
<p>
BOOST_HAS_TRIVIAL_ASSIGN(T)
</p>
</td>
<td>
<p>
Should evaluate to true if T has a trivial assignment operator (and
can therefore be replaced by a call to memcpy)
</p>
</td>
</tr>
<tr>
<td>
<p>
BOOST_HAS_TRIVIAL_CONSTRUCTOR(T)
</p>
</td>
<td>
<p>
Should evaluate to true if the default constructor for T is trivial
(i.e. has no effect)
</p>
</td>
</tr>
<tr>
<td>
<p>
BOOST_HAS_TRIVIAL_COPY(T)
</p>
</td>
<td>
<p>
Should evaluate to true if T has a trivial copy constructor (and
can therefore be replaced by a call to memcpy)
</p>
</td>
</tr>
<tr>
<td>
<p>
BOOST_HAS_TRIVIAL_DESTRUCTOR(T)
</p>
</td>
<td>
<p>
Should evaluate to true if T has a trivial destructor (i.e. ~T()
has no effect)
</p>
</td>
</tr>
<tr>
<td>
<p>
BOOST_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T)
</p>
</td>
<td>
<p>
Should evaluate to true if T has a trivial move constructor (and
can therefore be replaced by a call to memcpy)
</p>
</td>
</tr>
<tr>
<td>
<p>
BOOST_HAS_TRIVIAL_MOVE_ASSIGN(T)
</p>
</td>
<td>
<p>
Should evaluate to true if T has a trivial move assignment operator
(and can therefore be replaced by a call to memcpy)
</p>
</td>
</tr>
<tr>
<td>
<p>
BOOST_HAS_VIRTUAL_DESTRUCTOR(T)
</p>
</td>
<td>
<p>
Should evaluate to true T has a virtual destructor
</p>
</td>
</tr>
@ -340,10 +420,11 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>

View File

@ -1,10 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Introduction</title>
<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="prev" href="../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
@ -23,7 +22,7 @@
<div class="spirit-nav">
<a accesskey="p" href="../index.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="background.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="boost_typetraits.intro"></a><a class="link" href="intro.html" title="Introduction">Introduction</a>
</h2></div></div></div>
@ -49,10 +48,11 @@
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>

View File

@ -1,10 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>MPL Interoperability</title>
<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="prev" href="intrinsics.html" title="Support for Compiler Intrinsics">
@ -23,33 +22,31 @@
<div class="spirit-nav">
<a accesskey="p" href="intrinsics.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="examples.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="boost_typetraits.mpl"></a><a class="link" href="mpl.html" title="MPL Interoperability">MPL Interoperability</a>
</h2></div></div></div>
<p>
All the value based traits in this library conform to MPL's requirements for
an <a href="../../../../../libs/mpl/doc/refmanual/integral-constant.html" target="_top">Integral
Constant type</a>: that includes a number of rather intrusive workarounds
for broken compilers.
Constant type</a>.
</p>
<p>
Purely as an implementation detail, this means that <code class="computeroutput"><a class="link" href="reference/integral_constant.html" title="integral_constant">true_type</a></code>
inherits from <a href="../../../../../libs/mpl/doc/refmanual/bool.html" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">true_</span></code></a>,
<code class="computeroutput"><a class="link" href="reference/integral_constant.html" title="integral_constant">false_type</a></code>
inherits from <a href="../../../../../libs/mpl/doc/refmanual/bool.html" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">false_</span></code></a>,
and <code class="computeroutput"><a class="link" href="reference/integral_constant.html" title="integral_constant">integral_constant</a><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span>
<span class="identifier">v</span><span class="special">&gt;</span></code>
inherits from <a href="../../../../../libs/mpl/doc/refmanual/integral-c.html" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span><span class="identifier">v</span><span class="special">&gt;</span></code></a>
(provided <code class="computeroutput"><span class="identifier">T</span></code> is not <code class="computeroutput"><span class="keyword">bool</span></code>)
Please note that these types no longer inherit from <code class="computeroutput"><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">true_</span></code> or
<code class="computeroutput"><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">false_</span></code> etc, and the library will no longer
implicitly include any MPL header. However there is an implicit conversion
from <code class="computeroutput"><span class="identifier">integral_constant</span></code> to the
corresponding MPL types, therefore tag-dispatching that uses MPL types in function
overloads will still work as before.
</p>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>

View File

@ -1,10 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Alphabetical Reference</title>
<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="prev" href="examples/improved_min.html" title="Improving std::min with common_type">
@ -23,7 +22,7 @@
<div class="spirit-nav">
<a accesskey="p" href="examples/improved_min.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="reference/add_const.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="boost_typetraits.reference"></a><a class="link" href="reference.html" title="Alphabetical Reference">Alphabetical Reference</a>
</h2></div></div></div>
@ -39,36 +38,86 @@
<dt><span class="section"><a href="reference/alignment_of.html">alignment_of</a></span></dt>
<dt><span class="section"><a href="reference/conditional.html">conditional</a></span></dt>
<dt><span class="section"><a href="reference/common_type.html">common_type</a></span></dt>
<dt><span class="section"><a href="reference/copy_cv.html">copy_cv</a></span></dt>
<dt><span class="section"><a href="reference/decay.html">decay</a></span></dt>
<dt><span class="section"><a href="reference/declval.html">declval</a></span></dt>
<dt><span class="section"><a href="reference/extent.html">extent</a></span></dt>
<dt><span class="section"><a href="reference/floating_point_promotion.html">floating_point_promotion</a></span></dt>
<dt><span class="section"><a href="reference/function_traits.html">function_traits</a></span></dt>
<dt><span class="section"><a href="reference/has_bit_and.html">has_bit_and</a></span></dt>
<dt><span class="section"><a href="reference/has_bit_and_assign.html">has_bit_and_assign</a></span></dt>
<dt><span class="section"><a href="reference/has_bit_or.html">has_bit_or</a></span></dt>
<dt><span class="section"><a href="reference/has_bit_or_assign.html">has_bit_or_assign</a></span></dt>
<dt><span class="section"><a href="reference/has_bit_xor.html">has_bit_xor</a></span></dt>
<dt><span class="section"><a href="reference/has_bit_xor_assign.html">has_bit_xor_assign</a></span></dt>
<dt><span class="section"><a href="reference/has_complement.html">has_complement</a></span></dt>
<dt><span class="section"><a href="reference/has_dereference.html">has_dereference</a></span></dt>
<dt><span class="section"><a href="reference/has_divides.html">has_divides</a></span></dt>
<dt><span class="section"><a href="reference/has_divides_assign.html">has_divides_assign</a></span></dt>
<dt><span class="section"><a href="reference/has_equal_to.html">has_equal_to</a></span></dt>
<dt><span class="section"><a href="reference/has_greater.html">has_greater</a></span></dt>
<dt><span class="section"><a href="reference/has_greater_equal.html">has_greater_equal</a></span></dt>
<dt><span class="section"><a href="reference/has_left_shift.html">has_left_shift</a></span></dt>
<dt><span class="section"><a href="reference/has_left_shift_assign.html">has_left_shift_assign</a></span></dt>
<dt><span class="section"><a href="reference/has_less.html">has_less</a></span></dt>
<dt><span class="section"><a href="reference/has_less_equal.html">has_less_equal</a></span></dt>
<dt><span class="section"><a href="reference/has_logical_and.html">has_logical_and</a></span></dt>
<dt><span class="section"><a href="reference/has_logical_not.html">has_logical_not</a></span></dt>
<dt><span class="section"><a href="reference/has_logical_or.html">has_logical_or</a></span></dt>
<dt><span class="section"><a href="reference/has_minus.html">has_minus</a></span></dt>
<dt><span class="section"><a href="reference/has_minus_assign.html">has_minus_assign</a></span></dt>
<dt><span class="section"><a href="reference/has_modulus.html">has_modulus</a></span></dt>
<dt><span class="section"><a href="reference/has_modulus_assign.html">has_modulus_assign</a></span></dt>
<dt><span class="section"><a href="reference/has_multiplies.html">has_multiplies</a></span></dt>
<dt><span class="section"><a href="reference/has_multiplies_assign.html">has_multiplies_assign</a></span></dt>
<dt><span class="section"><a href="reference/has_negate.html">has_negate</a></span></dt>
<dt><span class="section"><a href="reference/has_new_operator.html">has_new_operator</a></span></dt>
<dt><span class="section"><a href="reference/has_not_equal_to.html">has_not_equal_to</a></span></dt>
<dt><span class="section"><a href="reference/has_nothrow_assign.html">has_nothrow_assign</a></span></dt>
<dt><span class="section"><a href="reference/has_nothrow_constructor.html">has_nothrow_constructor</a></span></dt>
<dt><span class="section"><a href="reference/has_nothrow_copy.html">has_nothrow_copy</a></span></dt>
<dt><span class="section"><a href="reference/has_nothrow_destruct.html">has_nothrow_destructor</a></span></dt>
<dt><span class="section"><a href="reference/has_nothrow_cp_cons.html">has_nothrow_copy_constructor</a></span></dt>
<dt><span class="section"><a href="reference/has_no_throw_def_cons.html">has_nothrow_default_constructor</a></span></dt>
<dt><span class="section"><a href="reference/has_plus.html">has_plus</a></span></dt>
<dt><span class="section"><a href="reference/has_plus_assign.html">has_plus_assign</a></span></dt>
<dt><span class="section"><a href="reference/has_post_decrement.html">has_post_decrement</a></span></dt>
<dt><span class="section"><a href="reference/has_post_increment.html">has_post_increment</a></span></dt>
<dt><span class="section"><a href="reference/has_pre_decrement.html">has_pre_decrement</a></span></dt>
<dt><span class="section"><a href="reference/has_pre_increment.html">has_pre_increment</a></span></dt>
<dt><span class="section"><a href="reference/has_right_shift.html">has_right_shift</a></span></dt>
<dt><span class="section"><a href="reference/has_right_shift_assign.html">has_right_shift_assign</a></span></dt>
<dt><span class="section"><a href="reference/has_trivial_assign.html">has_trivial_assign</a></span></dt>
<dt><span class="section"><a href="reference/has_trivial_constructor.html">has_trivial_constructor</a></span></dt>
<dt><span class="section"><a href="reference/has_trivial_copy.html">has_trivial_copy</a></span></dt>
<dt><span class="section"><a href="reference/has_trivial_cp_cons.html">has_trivial_copy_constructor</a></span></dt>
<dt><span class="section"><a href="reference/has_trivial_def_cons.html">has_trivial_default_constructor</a></span></dt>
<dt><span class="section"><a href="reference/has_trivial_destructor.html">has_trivial_destructor</a></span></dt>
<dt><span class="section"><a href="reference/has_trivial_move_assign.html">has_trivial_move_assign</a></span></dt>
<dt><span class="section"><a href="reference/has_trivial_move_constructor.html">has_trivial_move_constructor</a></span></dt>
<dt><span class="section"><a href="reference/has_unary_minus.html">has_unary_minus</a></span></dt>
<dt><span class="section"><a href="reference/has_unary_plus.html">has_unary_plus</a></span></dt>
<dt><span class="section"><a href="reference/has_virtual_destructor.html">has_virtual_destructor</a></span></dt>
<dt><span class="section"><a href="reference/integral_constant.html">integral_constant</a></span></dt>
<dt><span class="section"><a href="reference/integral_promotion.html">integral_promotion</a></span></dt>
<dt><span class="section"><a href="reference/is_abstract.html">is_abstract</a></span></dt>
<dt><span class="section"><a href="reference/is_arithmetic.html">is_arithmetic</a></span></dt>
<dt><span class="section"><a href="reference/is_array.html">is_array</a></span></dt>
<dt><span class="section"><a href="reference/is_assignable.html">is_assignable</a></span></dt>
<dt><span class="section"><a href="reference/is_base_of.html">is_base_of</a></span></dt>
<dt><span class="section"><a href="reference/is_class.html">is_class</a></span></dt>
<dt><span class="section"><a href="reference/is_complex.html">is_complex</a></span></dt>
<dt><span class="section"><a href="reference/is_compound.html">is_compound</a></span></dt>
<dt><span class="section"><a href="reference/is_const.html">is_const</a></span></dt>
<dt><span class="section"><a href="reference/is_constructible.html">is_constructible</a></span></dt>
<dt><span class="section"><a href="reference/is_convertible.html">is_convertible</a></span></dt>
<dt><span class="section"><a href="reference/is_copy_assignable.html">is_copy_assignable</a></span></dt>
<dt><span class="section"><a href="reference/is_copy_constructible.html">is_copy_constructible</a></span></dt>
<dt><span class="section"><a href="reference/is_default_constructible.html">is_default_constructible</a></span></dt>
<dt><span class="section"><a href="reference/is_destructible.html">is_destructible</a></span></dt>
<dt><span class="section"><a href="reference/is_empty.html">is_empty</a></span></dt>
<dt><span class="section"><a href="reference/is_enum.html">is_enum</a></span></dt>
<dt><span class="section"><a href="reference/is_final.html">is_final</a></span></dt>
<dt><span class="section"><a href="reference/is_floating_point.html">is_floating_point</a></span></dt>
<dt><span class="section"><a href="reference/is_function.html">is_function</a></span></dt>
<dt><span class="section"><a href="reference/is_fundamental.html">is_fundamental</a></span></dt>
@ -77,6 +126,8 @@
<dt><span class="section"><a href="reference/is_member_function_pointer.html">is_member_function_pointer</a></span></dt>
<dt><span class="section"><a href="reference/is_member_object_pointer.html">is_member_object_pointer</a></span></dt>
<dt><span class="section"><a href="reference/is_member_pointer.html">is_member_pointer</a></span></dt>
<dt><span class="section"><a href="reference/is_nothrow_move_assignable.html">is_nothrow_move_assignable</a></span></dt>
<dt><span class="section"><a href="reference/is_nothrow_move_constructible.html">is_nothrow_move_constructible</a></span></dt>
<dt><span class="section"><a href="reference/is_object.html">is_object</a></span></dt>
<dt><span class="section"><a href="reference/is_pod.html">is_pod</a></span></dt>
<dt><span class="section"><a href="reference/is_pointer.html">is_pointer</a></span></dt>
@ -94,6 +145,7 @@
<dt><span class="section"><a href="reference/is_volatile.html">is_volatile</a></span></dt>
<dt><span class="section"><a href="reference/make_signed.html">make_signed</a></span></dt>
<dt><span class="section"><a href="reference/make_unsigned.html">make_unsigned</a></span></dt>
<dt><span class="section"><a href="reference/make_void.html">make_void</a></span></dt>
<dt><span class="section"><a href="reference/promote.html">promote</a></span></dt>
<dt><span class="section"><a href="reference/rank.html">rank</a></span></dt>
<dt><span class="section"><a href="reference/remove_all_extents.html">remove_all_extents</a></span></dt>
@ -103,15 +155,17 @@
<dt><span class="section"><a href="reference/remove_pointer.html">remove_pointer</a></span></dt>
<dt><span class="section"><a href="reference/remove_reference.html">remove_reference</a></span></dt>
<dt><span class="section"><a href="reference/remove_volatile.html">remove_volatile</a></span></dt>
<dt><span class="section"><a href="reference/type_identity.html">type_identity</a></span></dt>
<dt><span class="section"><a href="reference/type_with_alignment.html">type_with_alignment</a></span></dt>
</dl></div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>

View File

@ -1,10 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>add_const</title>
<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../reference.html" title="Alphabetical Reference">
<link rel="prev" href="../reference.html" title="Alphabetical Reference">
@ -23,7 +22,7 @@
<div class="spirit-nav">
<a accesskey="p" href="../reference.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="add_cv.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_typetraits.reference.add_const"></a><a class="link" href="add_const.html" title="add_const">add_const</a>
</h3></div></div></div>
@ -40,21 +39,13 @@
<p>
<span class="bold"><strong>C++ Standard Reference:</strong></span> 3.9.3.
</p>
<p>
<span class="bold"><strong>Compiler Compatibility:</strong></span> If the compiler
does not support partial specialization of class-templates then this template
will compile, but the member <code class="computeroutput"><span class="identifier">type</span></code>
will always be the same as type <code class="computeroutput"><span class="identifier">T</span></code>
except where <a class="link" href="../category/transform.html#boost_typetraits.category.transform.broken_compiler_workarounds_">compiler
workarounds</a> have been applied.
</p>
<p>
<span class="bold"><strong>Header:</strong></span> <code class="computeroutput"> <span class="preprocessor">#include</span>
<span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">/</span><span class="identifier">add_const</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>
or <code class="computeroutput"> <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>
</p>
<div class="table">
<a name="boost_typetraits.reference.add_const.examples"></a><p class="title"><b>Table&#160;1.5.&#160;Examples</b></p>
<a name="boost_typetraits.reference.add_const.examples"></a><p class="title"><b>Table&#160;1.10.&#160;Examples</b></p>
<div class="table-contents"><table class="table" summary="Examples">
<colgroup>
<col>
@ -125,14 +116,18 @@
</tbody>
</table></div>
</div>
<br class="table-break">
<br class="table-break"><p>
<span class="bold"><strong>Compiler Compatibility:</strong></span> All current compilers
are supported by this trait.
</p>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>

View File

@ -1,10 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>add_cv</title>
<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../reference.html" title="Alphabetical Reference">
<link rel="prev" href="add_const.html" title="add_const">
@ -23,7 +22,7 @@
<div class="spirit-nav">
<a accesskey="p" href="add_const.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="add_lvalue_reference.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_typetraits.reference.add_cv"></a><a class="link" href="add_cv.html" title="add_cv">add_cv</a>
</h3></div></div></div>
@ -41,21 +40,13 @@
<p>
<span class="bold"><strong>C++ Standard Reference:</strong></span> 3.9.3.
</p>
<p>
<span class="bold"><strong>Compiler Compatibility:</strong></span> If the compiler
does not support partial specialization of class-templates then this template
will compile, but the member <code class="computeroutput"><span class="identifier">type</span></code>
will always be the same as type <code class="computeroutput"><span class="identifier">T</span></code>
except where <a class="link" href="../category/transform.html#boost_typetraits.category.transform.broken_compiler_workarounds_">compiler
workarounds</a> have been applied.
</p>
<p>
<span class="bold"><strong>Header:</strong></span> <code class="computeroutput"> <span class="preprocessor">#include</span>
<span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">/</span><span class="identifier">add_cv</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>
or <code class="computeroutput"> <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>
</p>
<div class="table">
<a name="boost_typetraits.reference.add_cv.examples"></a><p class="title"><b>Table&#160;1.6.&#160;Examples</b></p>
<a name="boost_typetraits.reference.add_cv.examples"></a><p class="title"><b>Table&#160;1.11.&#160;Examples</b></p>
<div class="table-contents"><table class="table" summary="Examples">
<colgroup>
<col>
@ -128,14 +119,18 @@
</tbody>
</table></div>
</div>
<br class="table-break">
<br class="table-break"><p>
<span class="bold"><strong>Compiler Compatibility:</strong></span> All current compilers
are supported by this trait.
</p>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>

View File

@ -1,10 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>add_lvalue_reference</title>
<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../reference.html" title="Alphabetical Reference">
<link rel="prev" href="add_cv.html" title="add_cv">
@ -23,7 +22,7 @@
<div class="spirit-nav">
<a accesskey="p" href="add_cv.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="add_pointer.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_typetraits.reference.add_lvalue_reference"></a><a class="link" href="add_lvalue_reference.html" title="add_lvalue_reference">add_lvalue_reference</a>
</h3></div></div></div>
@ -45,21 +44,13 @@
<p>
<span class="bold"><strong>C++ Standard Reference:</strong></span> 20.7.6.2.
</p>
<p>
<span class="bold"><strong>Compiler Compatibility:</strong></span> If the compiler
does not support partial specialization of class-templates then this template
will compile, but the member <code class="computeroutput"><span class="identifier">type</span></code>
will always be the same as type <code class="computeroutput"><span class="identifier">T</span></code>
except where <a class="link" href="../category/transform.html#boost_typetraits.category.transform.broken_compiler_workarounds_">compiler
workarounds</a> have been applied.
</p>
<p>
<span class="bold"><strong>Header:</strong></span> <code class="computeroutput"> <span class="preprocessor">#include</span>
<span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">/</span><span class="identifier">add_lvalue_reference</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>
or <code class="computeroutput"> <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>
</p>
<div class="table">
<a name="boost_typetraits.reference.add_lvalue_reference.examples"></a><p class="title"><b>Table&#160;1.7.&#160;Examples</b></p>
<a name="boost_typetraits.reference.add_lvalue_reference.examples"></a><p class="title"><b>Table&#160;1.12.&#160;Examples</b></p>
<div class="table-contents"><table class="table" summary="Examples">
<colgroup>
<col>
@ -154,14 +145,18 @@
</tbody>
</table></div>
</div>
<br class="table-break">
<br class="table-break"><p>
<span class="bold"><strong>Compiler Compatibility:</strong></span> All current compilers
are supported by this trait.
</p>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>

View File

@ -1,10 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>add_pointer</title>
<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../reference.html" title="Alphabetical Reference">
<link rel="prev" href="add_lvalue_reference.html" title="add_lvalue_reference">
@ -23,7 +22,7 @@
<div class="spirit-nav">
<a accesskey="p" href="add_lvalue_reference.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="add_reference.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_typetraits.reference.add_pointer"></a><a class="link" href="add_pointer.html" title="add_pointer">add_pointer</a>
</h3></div></div></div>
@ -37,27 +36,19 @@
<span class="bold"><strong>type:</strong></span> The same type as <code class="computeroutput"><span class="identifier">remove_reference</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">type</span><span class="special">*</span></code>.
</p>
<p>
The rationale for this template is that it produces the same type as <code class="computeroutput"><span class="identifier">TYPEOF</span><span class="special">(&amp;</span><span class="identifier">t</span><span class="special">)</span></code>, where
The rationale for this template is that it produces the same type as <code class="computeroutput"><span class="keyword">decltype</span><span class="special">(&amp;</span><span class="identifier">t</span><span class="special">)</span></code>, where
<code class="computeroutput"><span class="identifier">t</span></code> is an object of type <code class="computeroutput"><span class="identifier">T</span></code>.
</p>
<p>
<span class="bold"><strong>C++ Standard Reference:</strong></span> 8.3.1.
</p>
<p>
<span class="bold"><strong>Compiler Compatibility:</strong></span> If the compiler
does not support partial specialization of class-templates then this template
will compile, but the member <code class="computeroutput"><span class="identifier">type</span></code>
will always be the same as type <code class="computeroutput"><span class="identifier">T</span></code>
except where <a class="link" href="../category/transform.html#boost_typetraits.category.transform.broken_compiler_workarounds_">compiler
workarounds</a> have been applied.
</p>
<p>
<span class="bold"><strong>Header:</strong></span> <code class="computeroutput"> <span class="preprocessor">#include</span>
<span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">/</span><span class="identifier">add_pointer</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>
or <code class="computeroutput"> <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>
</p>
<div class="table">
<a name="boost_typetraits.reference.add_pointer.examples"></a><p class="title"><b>Table&#160;1.8.&#160;Examples</b></p>
<a name="boost_typetraits.reference.add_pointer.examples"></a><p class="title"><b>Table&#160;1.13.&#160;Examples</b></p>
<div class="table-contents"><table class="table" summary="Examples">
<colgroup>
<col>
@ -127,14 +118,18 @@
</tbody>
</table></div>
</div>
<br class="table-break">
<br class="table-break"><p>
<span class="bold"><strong>Compiler Compatibility:</strong></span> All current compilers
are supported by this trait.
</p>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>

View File

@ -1,10 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>add_reference</title>
<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../reference.html" title="Alphabetical Reference">
<link rel="prev" href="add_pointer.html" title="add_pointer">
@ -23,7 +22,7 @@
<div class="spirit-nav">
<a accesskey="p" href="add_pointer.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="add_rvalue_reference.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_typetraits.reference.add_reference"></a><a class="link" href="add_reference.html" title="add_reference">add_reference</a>
</h3></div></div></div>
@ -52,21 +51,13 @@
<p>
<span class="bold"><strong>C++ Standard Reference:</strong></span> 8.3.2.
</p>
<p>
<span class="bold"><strong>Compiler Compatibility:</strong></span> If the compiler
does not support partial specialization of class-templates then this template
will compile, but the member <code class="computeroutput"><span class="identifier">type</span></code>
will always be the same as type <code class="computeroutput"><span class="identifier">T</span></code>
except where <a class="link" href="../category/transform.html#boost_typetraits.category.transform.broken_compiler_workarounds_">compiler
workarounds</a> have been applied.
</p>
<p>
<span class="bold"><strong>Header:</strong></span> <code class="computeroutput"> <span class="preprocessor">#include</span>
<span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">/</span><span class="identifier">add_reference</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>
or <code class="computeroutput"> <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>
</p>
<div class="table">
<a name="boost_typetraits.reference.add_reference.examples"></a><p class="title"><b>Table&#160;1.9.&#160;Examples</b></p>
<a name="boost_typetraits.reference.add_reference.examples"></a><p class="title"><b>Table&#160;1.14.&#160;Examples</b></p>
<div class="table-contents"><table class="table" summary="Examples">
<colgroup>
<col>
@ -136,14 +127,18 @@
</tbody>
</table></div>
</div>
<br class="table-break">
<br class="table-break"><p>
<span class="bold"><strong>Compiler Compatibility:</strong></span> All current compilers
are supported by this trait.
</p>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>

View File

@ -1,10 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>add_rvalue_reference</title>
<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="../../index.html" title="Chapter&#160;1.&#160;Boost.TypeTraits">
<link rel="up" href="../reference.html" title="Alphabetical Reference">
<link rel="prev" href="add_reference.html" title="add_reference">
@ -23,7 +22,7 @@
<div class="spirit-nav">
<a accesskey="p" href="add_reference.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="add_volatile.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section" lang="en">
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_typetraits.reference.add_rvalue_reference"></a><a class="link" href="add_rvalue_reference.html" title="add_rvalue_reference">add_rvalue_reference</a>
</h3></div></div></div>
@ -45,19 +44,13 @@
<p>
<span class="bold"><strong>C++ Standard Reference:</strong></span> 20.7.6.2.
</p>
<p>
<span class="bold"><strong>Compiler Compatibility:</strong></span> If the compiler
does not support partial specialization of class-templates and rvalue references
then this template will compile, but the member <code class="computeroutput"><span class="identifier">type</span></code>
will always be the same as type <code class="computeroutput"><span class="identifier">T</span></code>.
</p>
<p>
<span class="bold"><strong>Header:</strong></span> <code class="computeroutput"> <span class="preprocessor">#include</span>
<span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">/</span><span class="identifier">add_rvalue_reference</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>
or <code class="computeroutput"> <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>
</p>
<div class="table">
<a name="boost_typetraits.reference.add_rvalue_reference.examples"></a><p class="title"><b>Table&#160;1.10.&#160;Examples</b></p>
<a name="boost_typetraits.reference.add_rvalue_reference.examples"></a><p class="title"><b>Table&#160;1.15.&#160;Examples</b></p>
<div class="table-contents"><table class="table" summary="Examples">
<colgroup>
<col>
@ -152,14 +145,18 @@
</tbody>
</table></div>
</div>
<br class="table-break">
<br class="table-break"><p>
<span class="bold"><strong>Compiler Compatibility:</strong></span> In the absence of
rvalue-reference support this trait has no effect.
</p>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2006 Adobe Systems Inc, David Abrahams,
Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat
Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten Ottosen, Robert
Ramey and Jeremy Siek<p>
<td align="right"><div class="copyright-footer">Copyright &#169; 2000, 2011 Adobe Systems Inc, David Abrahams,
Frederic Bron, Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant,
Jesse Jones, Mat Marcus, Itay Maman, John Maddock, Alexander Nasonov, Thorsten
Ottosen, Roman Perepelitsa, Robert Ramey, Jeremy Siek, Robert Stewart and Steven
Watanabe<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>

Some files were not shown because too many files have changed in this diff Show More