На самом деле можно изменить его в SSMS, это находится на вкладке Files на свойствах базы данных.
Есть пара общедоступных инструментов, которые могут вам помочь. Оба используют генерацию кода препроцессора для создания шаблонов, реализующих настраиваемые операторы. Эти операторы состоят из одного или нескольких встроенных операторов в сочетании с идентификатором.
Поскольку на самом деле это не пользовательские операторы, а всего лишь уловки перегрузки операторов, есть несколько предостережений:
_
, o
или аналогичные простые буквенно-цифровые символы. Когда я работал над своей собственной библиотекой для этой цели (см. Ниже), я наткнулся на этот проект. Вот пример создания оператора 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)
То, что начиналось как упражнение в чистой легкомыслии , стало моим собственным подходом к этой проблеме. Вот аналогичный пример:
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_>
Ваше предложение было бы не чем иным, как синтаксическим сахаром для:
if( contains( "Hello, world!", "Hello" ) ...
, и на самом деле уже есть функции для этого как в cstring, так и в std :: string. Что, возможно, немного похоже на ответ "это хорошая идея?" но не совсем; Скорее спрашиваю: «Зачем вам это нужно?»
Чтобы быть немного более точным, C ++ сам поддерживает только создание новых перегрузок существующих операций, а НЕ создание новых операторов. Существуют языки (например, ML и большинство его потомков), которые позволяют создавать совершенно новые операторы, но C ++ не входит в их число.
Судя по всему, (по крайней мере) библиотека CustomOperators, упомянутая в другой ответ также не поддерживает полностью настраиваемые операторы. По крайней мере, если я правильно читаю, он (внутренне) переводит ваш пользовательский оператор в перегрузку существующего оператора. Это упрощает задачу за счет некоторой гибкости - например, когда вы создаете новый оператор в ML, вы можете дать ему приоритет, отличный от приоритета любого встроенного оператора.
Технически нет. Другими словами, вы не можете расширить набор операторов +
, оператор-
и т.д. Но в своем примере вы предлагаете нечто иное. Вы задаетесь вопросом, существует ли определение "содержит" такое, что строковый литерал "содержит" строковый литерал
- это выражение с нетривиальной логикой ( #define contains ""
является тривиальным случаем).
Существует не так много выражений, которые могут иметь форму строковый литерал X строковый литерал
. Это потому, что сами строковые литералы являются выражениями. Итак, вы ищете языковое правило вида expr X expr
. Их довольно много, но все они правила для операторов, и они не работают со строками. Несмотря на очевидную реализацию, «Привет,» + «мир»
не является допустимым выражением. Итак, что еще может быть X в строковом литерале X строковом литерале
? Само по себе это не может быть выражением. Это не может быть имя типа, имя typedef или имя шаблона. Это не может быть имя функции. На самом деле это может быть только макрос - единственные оставшиеся именованные сущности. Для этого см. Ответ «Да (ну, вроде того)».