作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我怎样才能使(具有不同模板类型的对象)A*B 和 B*A 给出相同的结果,其中结果的类型是根据通常的 C++ 类型提升规则确定的?
例如:
int main()
{
number<float> A(2.0f);
number<double> B(3.0);
A*B; // I want 6.0 (double)
B*A; // I want 6.0 (double)
return 0;
}
目前,我只能将相同模板类型的对象相乘。例如,像这样:
template<typename T>
class number
{
public:
number(T v) : _value(v) {}
T get_value() const { return _value; }
number& operator*=(const number& rhs)
{
_value *= rhs.get_value();
return *this;
}
private:
T _value;
};
template<typename T>
inline number<T> operator*(number<T> lhs, const number<T>& rhs)
{
lhs *= rhs;
return lhs;
}
编辑:或者,如答案所示,我可以乘以不同模板类型的对象,但总是返回与 lhs 相同的类型。有什么方法可以返回一个类型由标准类型提升规则确定的对象吗?
编辑 2:我想尽可能避免使用 C++11 特性。
最佳答案
你必须模板化,例如rhs
参数:
template<typename T>
class number
{
public:
number(T v) : _value(v) {}
T get_value() const { return _value; }
template<class E>
number& operator*=(const number<E>& rhs)
{
_value *= rhs.get_value();
return *this;
}
private:
T _value;
};
template<class T, class E, class RET = decltype(T()*E())>
number<RET> operator*(number<T>& lhs, const number<E>& rhs)
{
return lhs.get_value()*rhs.get_value();
}
关于c++ - 如何在C++中将不同模板类型的对象相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29444345/
我是一名优秀的程序员,十分优秀!