Можно ли сделать пользовательские операторы в C++?

На самом деле можно изменить его в SSMS, это находится на вкладке Files на свойствах базы данных.

40
задан 6 revs, 3 users 68% 8 June 2016 в 18:58
поделиться

4 ответа

Да! (ну, вроде того)

Есть пара общедоступных инструментов, которые могут вам помочь. Оба используют генерацию кода препроцессора для создания шаблонов, реализующих настраиваемые операторы. Эти операторы состоят из одного или нескольких встроенных операторов в сочетании с идентификатором.

Поскольку на самом деле это не пользовательские операторы, а всего лишь уловки перегрузки операторов, есть несколько предостережений:

  • Макросы - зло. Если вы сделаете ошибку, компилятор будет практически бесполезен для отслеживания проблемы.
  • Даже если вы правильно написали макрос, если есть ошибка в использовании вами оператора или в определении вашей операции, компилятор будет лишь немного более полезным.
  • Вы должны использовать действительный идентификатор как часть оператора. Если вам нужен более символьный оператор, вы можете использовать _ , o или аналогичные простые буквенно-цифровые символы.

CustomOperators

Когда я работал над своей собственной библиотекой для этой цели (см. Ниже), я наткнулся на этот проект. Вот пример создания оператора avg :

#define avg BinaryOperatorDefinition(_op_avg, /)
DeclareBinaryOperator(_op_avg)
DeclareOperatorLeftType(_op_avg, /, double);
inline double _op_avg(double l, double r)
{
   return (l + r) / 2;
}
BindBinaryOperator(double, _op_avg, /, double, double)

IdOp

То, что начиналось как упражнение в чистой легкомыслии , стало моим собственным подходом к этой проблеме. Вот аналогичный пример:

template<typename T> class AvgOp { 
public: 
   T operator()(const T& left, const T& right) 
   {
      return (left + right) / 2; 
   }
};
IDOP_CREATE_LEFT_HANDED(<, _avg_, >, AvgOp)
#define avg <_avg_>

Ключевые различия

  • CustomOperators поддерживает постфиксные унарные операторы
  • Шаблоны IdOp используют ссылки, а не указатели, чтобы исключить использование бесплатного хранилища и обеспечить полную оценку операции во время компиляции
  • IdOp позволяет вам легко указать несколько операций для одного и того же корневого идентификатора
34
ответ дан 27 November 2019 в 01:52
поделиться

Ваше предложение было бы не чем иным, как синтаксическим сахаром для:

if( contains( "Hello, world!", "Hello" ) ...

, и на самом деле уже есть функции для этого как в cstring, так и в std :: string. Что, возможно, немного похоже на ответ "это хорошая идея?" но не совсем; Скорее спрашиваю: «Зачем вам это нужно?»

-2
ответ дан 27 November 2019 в 01:52
поделиться

Чтобы быть немного более точным, C ++ сам поддерживает только создание новых перегрузок существующих операций, а НЕ создание новых операторов. Существуют языки (например, ML и большинство его потомков), которые позволяют создавать совершенно новые операторы, но C ++ не входит в их число.

Судя по всему, (по крайней мере) библиотека CustomOperators, упомянутая в другой ответ также не поддерживает полностью настраиваемые операторы. По крайней мере, если я правильно читаю, он (внутренне) переводит ваш пользовательский оператор в перегрузку существующего оператора. Это упрощает задачу за счет некоторой гибкости - например, когда вы создаете новый оператор в ML, вы можете дать ему приоритет, отличный от приоритета любого встроенного оператора.

2
ответ дан 27 November 2019 в 01:52
поделиться

Технически нет. Другими словами, вы не можете расширить набор операторов + , оператор- и т.д. Но в своем примере вы предлагаете нечто иное. Вы задаетесь вопросом, существует ли определение "содержит" такое, что строковый литерал "содержит" строковый литерал - это выражение с нетривиальной логикой ( #define contains "" является тривиальным случаем).

Существует не так много выражений, которые могут иметь форму строковый литерал X строковый литерал . Это потому, что сами строковые литералы являются выражениями. Итак, вы ищете языковое правило вида expr X expr . Их довольно много, но все они правила для операторов, и они не работают со строками. Несмотря на очевидную реализацию, «Привет,» + «мир» не является допустимым выражением. Итак, что еще может быть X в строковом литерале X строковом литерале ? Само по себе это не может быть выражением. Это не может быть имя типа, имя typedef или имя шаблона. Это не может быть имя функции. На самом деле это может быть только макрос - единственные оставшиеся именованные сущности. Для этого см. Ответ «Да (ну, вроде того)».

которые являются единственными оставшимися именованными объектами. Для этого см. Ответ «Да (ну, вроде того)».

которые являются единственными оставшимися именованными объектами. Для этого см. Ответ «Да (ну, вроде того)».

0
ответ дан 27 November 2019 в 01:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: