#include <iostream>
struct GetValueImpl
{
template < typename T>
static auto test( int ) - > decltype(
std:: declval < T& > ( ) .GetValue ( 0 ) ,
std:: true_type { } ) ;
template < typename ...>
static std:: false_type test( ...) ;
} ;
template < typename T>
struct GetValueDefined : public decltype( GetValueImpl:: test < T> ( 0 ) ) { } ;
template < typename Derived, int X>
class Base
{
public :
// I want to define this function only if GetValue is defined in Derived
template < typename ... Args >
auto Test( const Args& ...) - > typename std:: enable_if < GetValueDefined< Derived> :: value > :: type
{
}
} ;
template < std:: int32_t val>
class DerivedExample : public Base< DerivedExample< val> , 1 >
{
public :
template < typename T>
int GetValue( ) { return 0 ; }
} ;
int main( ) {
DerivedExample< 1 > d;
d.Test ( 1 , 2 ) ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgpzdHJ1Y3QgR2V0VmFsdWVJbXBsCnsKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgc3RhdGljIGF1dG8gdGVzdChpbnQpIC0+IGRlY2x0eXBlKAogICAgICAgIHN0ZDo6ZGVjbHZhbDxUJj4oKS5HZXRWYWx1ZSgwKSwKICAgICAgICBzdGQ6OnRydWVfdHlwZXt9KTsKICAgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLj4KICAgIHN0YXRpYyBzdGQ6OmZhbHNlX3R5cGUgdGVzdCguLi4pOwp9Owp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IEdldFZhbHVlRGVmaW5lZCA6IHB1YmxpYyBkZWNsdHlwZShHZXRWYWx1ZUltcGw6OnRlc3Q8VD4oMCkpIHt9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQsIGludCBYPgpjbGFzcyBCYXNlCnsKICAgIHB1YmxpYzoKCiAgICAvLyBJIHdhbnQgdG8gZGVmaW5lIHRoaXMgZnVuY3Rpb24gb25seSBpZiBHZXRWYWx1ZSBpcyBkZWZpbmVkIGluIERlcml2ZWQKICAgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzPgogICAgYXV0byBUZXN0KGNvbnN0IEFyZ3MmLi4uKSAtPiB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxHZXRWYWx1ZURlZmluZWQ8RGVyaXZlZD46OnZhbHVlPjo6dHlwZQogICAgewogICAgfQp9OwoKdGVtcGxhdGUgPHN0ZDo6aW50MzJfdCB2YWw+CmNsYXNzIERlcml2ZWRFeGFtcGxlIDogcHVibGljIEJhc2U8RGVyaXZlZEV4YW1wbGU8dmFsPiwgMT4KewogICAgcHVibGljOgogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICBpbnQgR2V0VmFsdWUoKSB7cmV0dXJuIDA7fQp9OwoKaW50IG1haW4oKSB7CiAgICBEZXJpdmVkRXhhbXBsZTwxPiBkOwogICAgZC5UZXN0KDEsIDIpOwogICAgcmV0dXJuIDA7Cn0K
compilation info
prog.cpp: In instantiation of ‘class Base<DerivedExample<1>, 1>’:
prog.cpp:27:7: required from ‘class DerivedExample<1>’
prog.cpp:35:23: required from here
prog.cpp:21:10: error: no type named ‘type’ in ‘struct std::enable_if<false, void>’
auto Test(const Args&...) -> typename std::enable_if<GetValueDefined<Derived>::value>::type
^
prog.cpp: In function ‘int main()’:
prog.cpp:36:7: error: ‘class DerivedExample<1>’ has no member named ‘Test’
d.Test(1, 2);
^
stdout