【发布时间】:2015-04-04 08:34:52
【问题描述】:
我怎样才能使(使用不同模板类型的对象)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 功能。
【问题讨论】:
-
为什么要避开 c++11 的特性?
-
因为我不确定我在各个地方使用的任何/部分/所有工具链是否可以构建 C++11 代码,我不知道进行转换是多么痛苦。如果 C++11 是必要的,那么我将开始下载升级,这样我就可以进行排序了。
-
使用 C++11 很容易(请参阅我的回答),但我不知道使用 C++03 的解决方案(老实说,寻求解决方案没有意义)。
-
你使用什么编译器? Clang、GCC、英特尔编译器、VisualStudio 和 XCode(基于 clang)已经支持 C++11 多年(VS 支持并不完整,但对于手头的问题来说已经足够完善了)。此外,几乎所有仍受支持的 linux 发行版上的默认编译器 (gcc) 都应该支持必要的 c++11 特性子集。但即使你的一个编译器不支持它,我认为完成一次更新过程比坚持使用 pre c++11 代码更容易。
-
我主要使用 GCC,但偶尔必须使用 Visual Studio。我已经整理好这台笔记本电脑(它很轻松),并会在我使用其他电脑时处理它们。这两个答案都非常好用,但目前我使用的是
common_type,因为它似乎更直接一些。
标签: c++ templates operator-overloading