我试图基于返回类型返回对数组中值的引用。我在某处读到c ++不支持使用返回类型进行重载,但可以使用专门的模板。

我尝试并失败了..您能帮我弄清楚我做错了什么吗?

这就是我认为应该做到的:

uint16_t var_uint16[10];
float var_float[10];

template<class T>
T& Memory(int index) {  }

template<>
uint16_t& Memory<uint16_t>(int index) { return var_uint16[index]; }

template<>
float& Memory<float>(int index) { return var_float[index]; }


并这样称呼它:

float a = 10.0;
Memory(1) = a;     // Should set var_float[1] to 10.0


上面的代码产生以下错误:

no matching function for call to 'Memory(int)'
candidate is:
template<class T> T& Memory(int)
template argument deduction/substitution failed:
couldn't deduce template parameter 'T'

最佳答案

您只能根据返回类型重载强制转换运算符。您可以重载= operator以支持您的确切语义

struct Element {
    operator uint16_t&()
    {
        return var_uint16[i];
    }

    operator float&()
    {
        return var_float[i];
    }

    template <typename T>
    void operator=(T t)
    {
        T& val = *this;
        val = t;
    }
    int i;
};
inline Element Memory(int i) { return Element{i}; }

float a = 10.0;
Memory(1) = a;

float& x = Memory(1);
x = 10.0

关于c++ - 使用专用模板根据返回类型重载函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17933749/

10-13 05:07