#include <type_traits>
#include <string>

#define VAL std::declval<T>()

#define DEF_TRAIT(name, expression)                                  \
template <typename, typename=void> struct name : std::false_type {}; \
template <typename T>                                                \
struct name<T, decltype(void(expression))> : std::true_type {};

DEF_TRAIT(isDividable, VAL / VAL)
DEF_TRAIT(isAddable, VAL + VAL)

template <typename T>
struct myClass
{
	static_assert( isAddable<T>{}, "T not addable!" );
	static_assert( isDividable<T>{}, "T not dividable!" );
};

template class myClass<int>;
template class myClass<std::string>; // Fails for isDividable


int main() {}
