#include <iostream>
#include <vector>
template < class T, class F1>
class is_functor_enable {
struct detector { } ;
template < class Y>
static auto search( Y && ) - > std:: conditional_t < false , decltype( std:: declval < F1> ( ) ( std:: declval < Y> ( ) ) ) , void > ;
static auto search( ...) - > detector;
public :
static constexpr bool value = ! std:: is_same < decltype( search( std:: declval < T> ( ) ) ) , detector> :: value ;
} ;
#define GC_IS_HAS_METHOD(_arg_type, _arg_meth_name, ...) ({\
auto l = [](auto && lambda_arg) -> std::conditional<false, decltype(std::declval< decltype(lambda_arg) >(). _arg_meth_name ( __VA_ARGS__ )), void> {};\
is_functor_enable<_arg_type, decltype(l)>::value;\
})
int main( )
{
static_assert( GC_IS_HAS_METHOD( std:: vector < int > , foo, 3 ,4 ,5 ,6 ,7 ) , "ты хуй" ) ;
std:: cout
<< ' ' << GC_IS_HAS_METHOD( std:: vector < int > , size, ) //is vector<int> has method size, which takes nothing
<< ' ' << GC_IS_HAS_METHOD( std:: vector < int > , push_back, std:: declval < int & > ( ) ) //is vector<int> has method push_back, which takes int &
<< ' ' << GC_IS_HAS_METHOD( std:: vector < int > , insert, std:: declval < std:: vector < int > :: iterator > ( ) , std:: declval < int & > ( ) ) //is vector<int> has method insert, which takes iterator and value
<< ' ' << GC_IS_HAS_METHOD( std:: vector < int > , foo, 3 ,4 ,5 ,6 ,7 ) //is vector<int> has method foo, which takes 5 ints
;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgRjE+CmNsYXNzIGlzX2Z1bmN0b3JfZW5hYmxlIHsKCXN0cnVjdCBkZXRlY3RvciB7fTsKCXRlbXBsYXRlPGNsYXNzIFk+CglzdGF0aWMgYXV0byBzZWFyY2goWSAmJiktPiBzdGQ6OmNvbmRpdGlvbmFsX3Q8ZmFsc2UsIGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxGMT4oKShzdGQ6OmRlY2x2YWw8WT4oKSkpLCB2b2lkPjsKCXN0YXRpYyBhdXRvIHNlYXJjaCguLi4pIC0+IGRldGVjdG9yOwpwdWJsaWM6CglzdGF0aWMgY29uc3RleHByIGJvb2wgdmFsdWUgPSAhc3RkOjppc19zYW1lPGRlY2x0eXBlKHNlYXJjaChzdGQ6OmRlY2x2YWw8VD4oKSkpLCBkZXRlY3Rvcj46OnZhbHVlOwp9OwoKI2RlZmluZSBHQ19JU19IQVNfTUVUSE9EKF9hcmdfdHlwZSwgX2FyZ19tZXRoX25hbWUsIC4uLikgKHtcCgkJYXV0byBsID0gW10oYXV0byAmJiBsYW1iZGFfYXJnKSAtPiBzdGQ6OmNvbmRpdGlvbmFsPGZhbHNlLCBkZWNsdHlwZShzdGQ6OmRlY2x2YWw8IGRlY2x0eXBlKGxhbWJkYV9hcmcpID4oKS4gX2FyZ19tZXRoX25hbWUgKCBfX1ZBX0FSR1NfXyApKSwgdm9pZD4ge307XAoJCWlzX2Z1bmN0b3JfZW5hYmxlPF9hcmdfdHlwZSwgZGVjbHR5cGUobCk+Ojp2YWx1ZTtcCgl9KQoKaW50IG1haW4oKQp7CglzdGF0aWNfYXNzZXJ0KEdDX0lTX0hBU19NRVRIT0Qoc3RkOjp2ZWN0b3I8aW50PiwgZm9vLCAzLDQsNSw2LDcpLCAi0YLRiyDRhdGD0LkiKTsKCXN0ZDo6Y291dCAKCTw8ICcgJyA8PCBHQ19JU19IQVNfTUVUSE9EKHN0ZDo6dmVjdG9yPGludD4sIHNpemUsICkgLy9pcyB2ZWN0b3I8aW50PiBoYXMgbWV0aG9kIHNpemUsIHdoaWNoIHRha2VzIG5vdGhpbmcKCTw8ICcgJyA8PCBHQ19JU19IQVNfTUVUSE9EKHN0ZDo6dmVjdG9yPGludD4sIHB1c2hfYmFjaywgc3RkOjpkZWNsdmFsPGludCAmPigpKSAvL2lzIHZlY3RvcjxpbnQ+IGhhcyBtZXRob2QgcHVzaF9iYWNrLCB3aGljaCB0YWtlcyBpbnQgJgoJPDwgJyAnIDw8IEdDX0lTX0hBU19NRVRIT0Qoc3RkOjp2ZWN0b3I8aW50PiwgaW5zZXJ0LCBzdGQ6OmRlY2x2YWw8c3RkOjp2ZWN0b3I8aW50Pjo6aXRlcmF0b3I+KCksIHN0ZDo6ZGVjbHZhbDxpbnQgJj4oKSkgLy9pcyB2ZWN0b3I8aW50PiBoYXMgbWV0aG9kIGluc2VydCwgd2hpY2ggdGFrZXMgaXRlcmF0b3IgYW5kIHZhbHVlCgk8PCAnICcgPDwgR0NfSVNfSEFTX01FVEhPRChzdGQ6OnZlY3RvcjxpbnQ+LCBmb28sIDMsNCw1LDYsNykgLy9pcyB2ZWN0b3I8aW50PiBoYXMgbWV0aG9kIGZvbywgd2hpY2ggdGFrZXMgNSBpbnRzCgk7Cn0=
compilation info
prog.cpp: In function ‘int main()’:
prog.cpp:21:2: error: static assertion failed: ты хуй
static_assert(GC_IS_HAS_METHOD(std::vector<int>, foo, 3,4,5,6,7), "ты хуй");
^~~~~~~~~~~~~
stdout