#include <type_traits>
#include <string>

template <typename, typename=void>
struct isAddable : std::false_type {};

template <typename T>
struct isAddable<T, decltype(void(std::declval<T>() + std::declval<T>()))>
    : std::true_type {};

template <typename, typename=void>
struct isDividable : std::false_type {};

template <typename T>
struct isDividable<T, decltype(void(std::declval<T>() / std::declval<T>()))>
    : std::true_type {};

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() {}
