#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( ) { }
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8c3RyaW5nPgoKI2RlZmluZSBWQUwgc3RkOjpkZWNsdmFsPFQ+KCkKCiNkZWZpbmUgREVGX1RSQUlUKG5hbWUsIGV4cHJlc3Npb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZT12b2lkPiBzdHJ1Y3QgbmFtZSA6IHN0ZDo6ZmFsc2VfdHlwZSB7fTsgXAp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCnN0cnVjdCBuYW1lPFQsIGRlY2x0eXBlKHZvaWQoZXhwcmVzc2lvbikpPiA6IHN0ZDo6dHJ1ZV90eXBlIHt9OwoKREVGX1RSQUlUKGlzRGl2aWRhYmxlLCBWQUwgLyBWQUwpCkRFRl9UUkFJVChpc0FkZGFibGUsIFZBTCArIFZBTCkKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgbXlDbGFzcwp7CglzdGF0aWNfYXNzZXJ0KCBpc0FkZGFibGU8VD57fSwgIlQgbm90IGFkZGFibGUhIiApOwoJc3RhdGljX2Fzc2VydCggaXNEaXZpZGFibGU8VD57fSwgIlQgbm90IGRpdmlkYWJsZSEiICk7Cn07Cgp0ZW1wbGF0ZSBjbGFzcyBteUNsYXNzPGludD47CnRlbXBsYXRlIGNsYXNzIG15Q2xhc3M8c3RkOjpzdHJpbmc+OyAvLyBGYWlscyBmb3IgaXNEaXZpZGFibGUKCgppbnQgbWFpbigpIHt9Cg==
compilation info
prog.cpp: In instantiation of ‘class myClass<std::basic_string<char> >’:
prog.cpp:22:16: required from here
prog.cpp:18:2: error: static assertion failed: T not dividable!
static_assert( isDividable<T>{}, "T not dividable!" );
^
stdout