#include <iostream>
#include <type_traits>

using namespace std;

class C
{
private:
    class integral {};
    class floatingpoint {};

    template<typename T>
    using SelectOverload =
        typename conditional<
            is_integral<T>::value,
            integral,
            typename conditional<is_floating_point<T>::value,
                floatingpoint,
                void
            >::type
        >::type;

public:
    template<typename T>
    explicit C(T&& value) { init(forward<T>(value), SelectOverload<T>()); }

private:    
    template<typename T>
    void init(T&& value, integral) { cout << "integral" << std::endl; }
    template<typename T>
    void init(T&& value, floatingpoint) { cout << "floating point" << std::endl; }
    
};

int main()
{
    C a(1);
    C b(1.0);
}