BOOST_STRONG_TYPEDEF和重载关系操作符
BOOST_STRONG_TYPEDEF and overloaded relational operators
我使用BOOstrongTRONG_TYPEDEF从POD类型定义强类型。例如,我想从int
定义一个新类型。然而,如果我试图将我的新类型与int
以外的东西进行比较(例如unsigned int
, size_t
),我会得到"使用重载操作符'<'是模棱两可的"编译器错误。
#include <boost/serialization/strong_typedef.hpp>
BOOST_STRONG_TYPEDEF( int, Foo );
int main(int argc, const char * argv[]) {
Foo f( 10 );
unsigned int j = 11;
bool result = j < f; // Error
size_t s = 100;
result = s < f; // Error
int h = 101;
result = h < f; // ok
return 0;
}
可以通过为特定类型实现特定的关系操作符来修复这些错误。例如:
bool operator<(const size_t& y, const Foo& x) {
return y < x.t;
}
由于BOOstrongTRONG_TYPEDEF提供了从Foo
到int
的转换操作符,我希望(unsigned int) < (Foo)
编译成与(unsigned int) < (int)
相同的东西,但我猜不是。
我的问题是:是否有任何方法可以避免为我想比较的每种类型实现每个操作符?
由于BOOstrongTRONG_TYPEDEF提供了从
Foo
到int
的转换操作符,我希望(unsigned int) < (Foo)
编译成与(unsigned int) < (int)
相同的东西,但我猜不是。
BOOST_STRONG_TYPEDEF
宏定义了一个struct Foo
,它继承了一堆不同的操作符类,其中一个将定义:
friend bool operator<(const int&, const Foo&); //(1)
当然还有很多内置的比较整数的程序:
bool operator<(T, U); // (2), implicit
对于所有的整型,I
,我们有几个可行的候选I{} < Foo{}
。我们可以将I
转换为int
并调用(1)
,或者将Foo
转换为int
并调用(2)
。根据I
,结果是:
-
I
是int
:(1)
是一个精确匹配,并且所有内置操作符都涉及转换,因此(1)
无疑是首选。 -
I
具有低于int
(例如char
)的级别:积分提升(直到int
)具有比转换(Foo
到int
)更高的级别,因此(1)
无疑是首选。 -
I
具有高于int
的排名(例如,size_t
和unsigned int
在您的示例中):(1)
现在涉及整数转换(size_t
到int
不是提升),整数转换具有排名转换,与用户自定义转换相同的排名。所以(1)
和(2)
都有一个精确匹配和一个转换。因为哪一个都不比另一个好,所以它是模棱两可的。
我的问题是:是否有任何方法可以避免为我想比较的每种类型实现每个操作符?
不,没有。但是,您可以使用模板一次性实现每种类型的每个操作符。例如,我们可以用:
来解决<
的所有歧义。template <typename T>
bool operator<(const T& t, const Foo& f)
{
return t < static_cast<int>(f);
}
对于秩为int
的整型,仍然优先选择(1)
。但是对于所有其他整型,模板将是精确匹配的,而内置和(1)
涉及一些转换序列,因此这将是首选-这将转发到一个模棱两可的内置。
- C++GTKMM gui循环依赖关系
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- Doxygen - 如何在不生成图形的情况下生成文本调用关系结果
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 在 c++ 中对字符串进行操作的关系运算符无法按预期工作
- 如何记住这种递归关系?
- 如何在头文件中声明类模板(由于循环依赖关系)
- 移动语义和深层/浅层复制之间有什么关系?
- 如何在不知道对应关系的情况下在字符串中搜索字符并将其分配给另一个字符?
- 对在不同二进制文件中创建的对象文件的依赖关系
- #include < conio.h> 和 getch() 方法之间的关系是什么?
- 使用Bazel构建具有不同编译器/链接器选项的C/C++依赖关系
- OpenVINO - 推理库插件 libMKLDNNPlugin.so 无法解析依赖关系
- 模拟测试中类的依赖关系
- 关于记忆后这种递归关系的时间复杂度
- C++模板方法中的循环依赖关系
- 解析正交模块的依赖关系
- 在使用c++类的下标操作符传递的数组中使用关系操作符
- 友元函数及其与I/O操作符的关系
- BOOST_STRONG_TYPEDEF和重载关系操作符