c++templatescompilationdecltypedeclval

Compiler infering the template argument


template<typename T>
class A
{
    public:

    A(T &t)
    : t_(t){}

    T t_;
};


int main()
{
    int value;
    A<decltype(value)> a(value);
    // what I wish for : A a(value); 
    // which does not compile "missing template argument before 'a'"
}

Is there a way in the declaration of A (or somewhere else) to hint the compiler that T should be automatically resolved to the type passed to the constructor ?

(ideally c++11, but happy to hear about less old versions)


Solution

  • In C++11 you can create a simple make_A function like this:

    #include <iostream>
    
    template <typename T>
    class A {
    public:
        A(T &t) : t_(t) {}
    
        T t_;
    };
    
    template <typename T>
    A<T> make_A(T&& t) {
        return A<T>(std::forward<T>(t));
    }
    
    int main() {
        int value = 0;
        auto a = make_A(value);
    
        return 0;
    }
    

    Demo