SFINAE可能会有帮助,这样的:(https://ideone.com/XmjQY8)
#include <type_traits>
#include <cstdint>
#define DEFINE_HAS_SIGNATURE(traitsName, funcName, signature) \
template <typename U> \
class traitsName \
{ \
private: \
template<typename T, T> struct helper; \
template<typename T> \
static std::uint8_t check(helper<signature, &funcName>*); \
template<typename T> static std::uint16_t check(...); \
public: \
static \
constexpr bool value = sizeof(check<U>(0)) == sizeof(std::uint8_t); \
}
DEFINE_HAS_SIGNATURE(has_X, T::X, bool (T::*)());
DEFINE_HAS_SIGNATURE(has_Y, T::Y, bool (T::*)());
template <typename T>
typename std::enable_if<has_X<T>::value && has_Y<T>::value, bool>::type
func(T a)
{
if(a.X())
return a.Y();
return false;
}
template <typename T>
typename std::enable_if<!has_X<T>::value || !has_Y<T>::value, bool>::type
func(T /*a*/)
{
return false;
}
只有在编译时可以评估'T :: X()',编译时才知道'a',但是涉及到一些模板bla bla,这才会起作用。请澄清是否是这种情况!如果情况并非如此,那么在编译时无法检测到情况,其中'T :: X()'返回true,但是'T :: Y()'不存在。但是,您可以在运行时执行此操作。 –
'if(a)return b;返回false;'是写'return a和b;'的复杂方式。 –