Template return type deduction from lvalue?

后端 未结 1 1644
一个人的身影
一个人的身影 2020-12-18 06:25

This might be a silly question but I would like to have it clarified none the less. Lets say I have a template function like so:

template T ge         


        
相关标签:
1条回答
  • 2020-12-18 07:26

    Template instantiation can only deduce its parameters from the arguments to given templated object(function in this case) so no, the variable type does not matter in deducing, and you either have to provide dummy argument of type T to the function or hardcode it as you did in the second to last script code(getValue<int>(...)).

    There is a possible workaround using type deduction presented in the comments :

    #include <iostream>
    
    namespace byte_read {
        //this is a hack to deduce the type using implicit conversion
        struct type_converter {
            const char* buffer;
    
            template<typename T>
                operator T() {
                std::cout << "implicit convertion from " << typeid(buffer).name() 
                    << " to " << typeid(T).name() << std::endl;
                //casting memory to the desired type
                return static_cast<T>(*buffer);
            }
        };
        type_converter getValue(const char * buffer) {
            //here buffer is implicitly converted to T type using the operator T()
            return {buffer};
        }
    
    }
    using namespace byte_read;
    
    int main()
    {
        char buffer[]{0,1,0,0 //int 256 encoded
                      ,97      //char 'a' encoded
                     };
        //pointer to read the buffer sequentialy
        char* pos = buffer;
        //pointer used to count the bytes readed
        char* last_pos = pos;
    
        int int_256 = getValue(pos);
        pos+=sizeof(int);
        std::cout << int_256 << " bytes readed :" << pos - last_pos << std::endl;
    
        last_pos = pos;
        char char_a = getValue(pos);
        pos+=sizeof(char);
        std::cout << char_a << " bytes readed :" << pos - last_pos << std::endl;
    
    }
    

    You can try it here

    0 讨论(0)
提交回复
热议问题