В этом разделе описано несколько вспомогательных инструментов, написанных как частьBoost.Convert, но которые могут быть полезны в их собственных правах.
Макро BOOST_DECLARE_HAS_MEMBER позволяет декларировать черту, которая затем позволяет интроспектировать существование члена класса (члена данных или функции члена) с указанным именем.
Например, следующие декларации вводятместные:имеет_начало
иместный::имеет_funop
признаки, которые затем позволяют проверить, если поставляемый класс имеет соответственно, начинают
иоператора()
Члены:
namespace { namespace local
{
BOOST_DECLARE_HAS_MEMBER(has_begin, begin);
BOOST_DECLARE_HAS_MEMBER(has_funop, operator());
}}
Теперь эти черты можно использовать следующим образом:
namespace { namespace local
{
struct test01 { int begin; };
struct test02 { char* begin() { return 0; } };
struct test22 { void operator()() {} };
}}
BOOST_TEST(local::has_begin<local::test01>::value == true);
BOOST_TEST(local::has_begin<local::test02>::value == true);
BOOST_TEST(local::has_funop<local::test22>::value == true);
Как видно из примера, признаки проверяют только на наличие элемента (будь то элемент данных или функция члена) с указанным именем.