2014-04-04 2 views
1

Я создаю нестандартный тип. В идеале это было бы как можно более взаимозаменяемо с базовым типом. С этой целью я перегрузил все операторы класса и предоставил шаблонный конструктор для принятия всех основных типов. Оценка смешанных типов всегда способствует моему такому типу.Пользовательские типы, типы конверсий, с которыми конфликтуют операторы?

auto result = 5/mycustomtype * 2.0f; // result is of type MyCustomType 

Теперь я представил реализации для операторов int, float и double. В идеале приемы должны работать, поскольку пользователи могут ожидать их для любого типа.

Это добавление напечатанного материала операторов, поставили меня в нечетном месте:

С кодом:

if (mycustomtype > 5) { ... } 

Компилятор видит много возможностей, включая этот пример:

if (mycustomtype > MyCustomType(5)) { ... } 

или

if ((int)mycustomtype > 5) { ... } 

Как таковой он дает мне ошибку для каждой возможной комбинации типов, к которым он мог бы преобразоваться. Я понимаю, почему у него есть все эти варианты, но я застрял в том, как я могу это разрешить. Простой выход, чтобы не поддерживать преобразования типов в этой манере и скорее обеспечивает интерфейс, как:

auto f = mycustomtype.As<float>() 

Однако было бы очень здорово, если бы мне торт и съесть его.

PS: Пример вывода ошибки -

c:\...\MyType.cpp(106): error C2666: 'MyType< template params >::operator >=' : 4 overloads have similar conversions 
     with 
     [ 
      template specializations... 
     ] 
     c:\...\MyType.h(63): could be 'bool MyType<...>::operator >=(const MyType<...> &) const' 
     with 
     [ 
      template specializations... 
     ] 
     or  'built-in C++ operator>=(float, double)' 
     or  'built-in C++ operator>=(int, double)' 
     or  'built-in C++ operator>=(double, double)' 
     while trying to match the argument list '(MyType, double)' 

ответ

1

С C++ 11 можно отметить операторы преобразования типа operator int() {...} в explicit (см here).

Таким образом, вам нужно либо использовать C++ 11, либо явное преобразование, либо забыть об этих операторах преобразования типов.

Кстати, в C++ 11 есть также user-defined literals:

MyType operator"" _mytype (unsigned long long n) { 
    return MyType{n}; 
} 

При этом вы можете написать:

if(mycustomtype > 5_mytype) { ... } 
+0

К сожалению, я использую VS2012, и это не кажется, поддерживает явное операторы. Стандартом компании по-прежнему является VS2012, поэтому обновление не является вариантом. Спасибо за ответ tho :) Я не знал, что операторы могут быть явными. Много приятных вещей в C++ 11! – qeadz

+0

После некоторого очень исчерпывающего поиска до и после задавания этого вопроса кажется, что Дэнвилл прав. Кажется, что создание операторов-операторов типов является единственным способом. Думаю, я откажусь от поддержки, пока мы не воспользуемся компилятором, который сможет это сделать. Спасибо за помощь. – qeadz

 Смежные вопросы

  • Нет связанных вопросов^_^