#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;
}
