As it has already been said, the correct solution would be to check for the __cplusplus
macro. However, some compilers have a partial support for C++11 features but do not set this macro for the correct value. For example, strongly-typed enumerations are available in g++ since GCC 4.4.0. However, with the option -std=c++11
(and its equivalents), the macro __cplusplus
was not set to the good value before GCC 4.7.0 (it was set to 1 instead). That means that some compilers can compile your code but won't if you check for C++11 that way.
If you just need specific features, then I would check for them with Boost.Config which defines a whole set of macros that can be used to check whther your compiler supports the required features. In your case, you would need:
BOOST_NO_CXX11_SCOPED_ENUMS
for strongly-typed enumerations.
BOOST_NO_CXX11_SMART_PTR
for std::shared_ptr
.