- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在研究两个定义真实和复杂数据类型的包装器类。每个类都定义了重载的构造函数,还有四个算术运算符+、-、*、/和五个赋值运算符=、+=等。为了避免重复代码,我想在左右时使用模板函数- 运算符的手边参数是不同的数据类型:
// real.h
class Real {
public:
explicit Real(const double& argument) {...}
explicit Real(int argument) {...}
...
friend const operator*(const Real&; const Real&);
template <class T> friend const Real operator*(const Real&, const T&);
template <class T> friend const Real operator*(const T&, cont Real&);
// Here, T is meant to be a template parameter for double and int
// Repeat for all other arithmetic and assignment operators
};
// complex.h
class Complex {
public:
explicit Complex(const Real& realPart) {...}
explicit Complex(const Real& realPart, const Real& imaginaryPart) {...}
// Overload for double and int data types
...
friend const operator*(const Complex&, const Complex&);
template <class T> friend const Complex operator*(const Complex&, const T&);
template <class T> friend const Complex operator*(const T&, cont Complex&);
// Here, T is is a template parameter for Real, double and int
...
};
这里的问题是这样的代码:
//main.cpp
void main() {
Complex ac(2.0, 3.0);
Real br(2.0);
Complex cc = ac * br;
}
返回编译器 (gcc) 错误'ac * br' 中'operator*' 的不明确重载,因为编译器无法分辨以下两者之间的区别:
template <class T> friend const Complex operator*(const Complex&, const T&)
[with T = Real]template <class T> friend const Real operator*(const T&, cont Real&)
[with T = Complex]有没有办法在 Real 类的模板 operator* 定义中指定 T 不能是 Complex?或者我是否必须在没有模板的情况下为每个可能的参数数据类型组合定义每个运算符?或者有没有办法重新设计代码?
最佳答案
啊,运算符的问题...
Boost 创建了一个不错的库,因此通过提供最少的逻辑,所有其他变体都会自动为您添加!
看看Boost.Operators !
现在针对您的问题,实际上正如您注意到的那样,您将必须定义两种类型的运算符(int 和 double),而不是使用通用模板。如果这些运算符中有很多逻辑(我对此表示怀疑),您始终可以让它们调用通用(模板化)方法。
template <typename T>
Complex complex_mult_impl(T const& lhs, Complex const& rhs) { ... } // Note (1)
// return type is not 'Complex const', see (2)
Complex operator*(int lhs, Complex const& rhs)
{
return complex_mult_impl(lhs,rhs);
}
但是如果你使用 Boost.operators 你只需要提供 Complex::operator*=(int) 和 Complex::operator*=(double) 并且独立版本会被自动推导:)
(1) 如果所有参数都是内置参数,您可以在此处使用按值传递。您可能还想考虑 Boost.CallTraits ,它根据参数是否内置,自动在 by-value 和 by-ref 之间进行选择。这对于模板很方便。
(2) 按值返回参数时,将它们限定为const
是没有意义的。 const
关键字仅表示引用和指针,这里没有什么可以阻止用户实例化“简单”Complex
...您很幸运,它没有!
关于c++ - 模板运算符的不明确重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1629829/
我在 linux 上工作。我对windows没有太多想法。 windows中文件的权限是如何组织的?我们在unix中是否有像chmod这样的api来更改权限? 最佳答案 对于 Windows,有一个名
应用程序编程接口(interface) (API) 是一组用于访问基于 Web 的软件应用程序的编程指令和标准。 如果出现 ,有人可以向我解释一下吗?谷歌地图 或 优酷 这是API哪个是softwar
我有两个应用程序,A 和 B,它们使用 android 库 C。B 有一个服务 A 想通过 C 使用,例如 在我的库中有一个类试图将它绑定(bind)到服务,
我正在正常或安全模式下启动相机应用程序,具体取决于使用我的应用程序执行的手势,但一旦用户选择应用程序并点击始终,则没有选项可以更改默认值,即使是从 Android 的设置菜单中也是如此. camera
我有一个数据集,本质上是一个稀疏二进制矩阵,表示两个集合的元素之间的关系。例如,让第一组是人(用他们的名字表示),例如像这样的东西: people = set(['john','jane','mike
何为pythonic? pythonic如果翻译成中文的话就是很python。很+名词结构的用法在中国不少,比如:很娘,很国足,很CCTV等等。 我的理解为,很+名词表达了一种特殊和强调的意味。
某些 Prolog 目标的确定性成功问题已经一次又一次地出现在 - 至少 - 以下问题: Reification of term equality/inequality Intersection an
我指的是 DateTime.TryParse(string s, out DateTime result) 重载,它尝试从字符串中解析 DateTime - 没有特定的格式正在指定。 我可以从http
2020 年 04 月 10 日,《中共中央国务院关于构建更加完善的要素市场化配置体制机制的意见》正式公布,将数据确立为五大生产要素(土地、资本、劳动力以及技术)之
有人可以解释一下 NSNotification 的 addObserver 函数中 notificationSender 的用途吗? 这是 Apple 文档的解释: notificationSende
我是一名优秀的程序员,十分优秀!