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