With clang in Boost.Hana you can use `hana:overload_linearly`: template<class T> void optional_foo(T&& x) { boost::hana::overload_linearly( // Call foo if it exists [](auto&& x) -> decltype(x.foo(), void()) { x.foo(); }, [](auto) { std::cout << "No foo" << std::endl; } )(x); } However, if you need more portability(such as running on MSVC), you can use `fit::conditional` as well: http://fit.readthedocs.org/en/latest/conditional/index.html Although its not yet a boost library, it is in the review queue and can work for MSVC and C++11 compilers. With the Fit library you can also define the function directly from the lambdas as well: FIT_STATIC_LAMBDA_FUNCTION(optional_foo) = fit::conditional( // Call foo if it exists [](auto&& x) -> decltype(x.foo(), void()) { x.foo(); }, [](auto) { std::cout << "No foo" << std::endl; } ); This still requires generic lambdas. If you are stuck in a C++11 compiler, you can write it using function objects as well: struct with_foo { template<class T> auto operator()(T&& obj) const -> decltype(x.foo(), void()) { x.foo(); } }; struct without_foo { template<class T> void operator()(T&&) const { std::cout << "No foo" << std::endl; } }; FIT_STATIC_FUNCTION(optional_foo) = fit::conditional( with_foo(), without_foo() ); If you are stuck in C++03 land, though, you will need to use Boost.TTI Thanks, Paul On Thursday, January 14, 2016 at 1:43:09 PM UTC-6, Juan Dent wrote:
HI,
I have read that via enable_if and other constructs, one can declare a member of a type conditionally.
What I need is a way to be able to test whether a certain type has a certain method or member data, so that I can call it or use it accordingly.
Does boost have something like this??
Regards, Juan
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost