#include <iostream>
#include <type_traits>

class Foo
{
    public:
    template<typename DT, typename = std::enable_if_t<!std::is_pointer<std::decay_t<DT>>::value>>   
    Foo(const DT& newValue)
    {
        std::cout<<"In const DT& version"<<std::endl;
    }

    template<typename DT>
    Foo(const DT* newValue)
    {
        std::cout<<"In const DT* version"<<std::endl;
    }
};

int main()
{
    int i=7;
    
    Foo f1(i); 
    Foo f2(&i); 
    
    const int i_const = 7;
    Foo f3(i_const); 
    Foo f4(&i_const);
    
    int arr[5];
    Foo f5(arr);
    Foo f6(&arr);
}