Я использую Boost.TTI для проверки существования функции-члена.Я хочу проверить не только существующие функции, но и несуществующие функции.
Boost.TTI, похоже, не работает для производных классов, даже если я использую using
целевые функции-члены.
#include <boost/tti/has_member_function.hpp>
BOOST_TTI_HAS_MEMBER_FUNCTION(func1);
BOOST_TTI_HAS_MEMBER_FUNCTION(func2);
struct base {
void func1() {}
};
struct derived : base {
};
struct derived_using : base {
using base::func1;
};
int main() {
static_assert( has_member_function_func1<base, void>::value);
static_assert(!has_member_function_func2<base, void>::value);
static_assert( has_member_function_func1<derived, void>::value); // error
static_assert(!has_member_function_func2<derived, void>::value);
static_assert( has_member_function_func1<derived_using, void>::value); // error
static_assert(!has_member_function_func2<derived_using, void>::value);
}
Runnin Demo: https://wandbox.org/permlink/5XkyCoeo0xEGVm3M
Я хочу проверить функцию-член, а не любые элементы (типы, переменные) с таким именем, как func1
func2
.
Также я попробовал std::is_invocable
.Это работает, как я ожидал, для производного класса, но ошибка компиляции происходит для несуществующих функций.
#include <type_traits>
struct base {
void func1() {}
};
struct derived : base {
};
int main() {
static_assert( std::is_invocable<decltype(&base::func1), base>::value);
static_assert(!std::is_invocable<decltype(&base::func2), base>::value);
static_assert( std::is_invocable<decltype(&derived::func1), derived>::value);
static_assert(!std::is_invocable<decltype(&derived::func2), derived>::value);
}
Запуск демонстрации: https://wandbox.org/permlink/3v9H0CFVxPnfGj3t
Есть ли хороший способ проверить существование функции-члена, которыйподдерживает как производные классы, так и функции-несуществующие.