Я использую BOOST_STRONG_TYPEDEF для определения сильных типов типов POD. Например, я хочу определить новый тип от int
. Однако, если я попытаюсь сравнить свой новый тип с чем-то, что не int
(например, unsigned int
, size_t
), я получаю «Использование перегруженного оператора» < «неоднозначный» компилятор ошибок.BOOST_STRONG_TYPEDEF и перегруженные операторы связи
Например:
#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;
}
С BOOST_STRONG_TYPEDEF предоставляет операторы преобразования из Foo
в int
, я ожидал бы (unsigned int) < (Foo)
компилировать вниз к тому же, как (unsigned int) < (int)
, но я не думаю.
Мой вопрос: есть ли способ избежать внедрения каждого оператора для каждого типа, с которым я хочу сравнить?
Очень информативный ответ, спасибо. Есть ли причина предпочесть static_cast в функции шаблона по прямому доступу к переменной члена Foo? –
Tyson