Оператор implicit
работает только для назначения.
Вы хотите перегрузить оператор равенства (==
) следующим образом:
class a
{
public static bool operator ==(a x, b y)
{
return x == y.a;
}
public static bool operator !=(a x, b y)
{
return !(x == y);
}
}
class b
{
public a a{get;set;}
public static implicit operator a(b b)
{
return b.a;
}
}
Затем это должно разрешить вы сравниваете два объекта типа a
и b
, как было предложено в вашем сообщении.
var x = new a();
var y = new b();
bool c = (x == y); // compiles
Примечание:
Я рекомендую просто переопределить GetHashCode
и Equals
, как компилятор предупреждает, но поскольку вы, похоже, хотите их подавить, вы можете сделать это следующим образом.
Измените объявление класса a
на:
#pragma warning disable 0660, 0661
class a
#pragma warning restore 0660, 0661
{
// ...
}
Объявление
прототип для функции, которая берет параметр функции, похож на следующее:
void func ( void (*f)(int) );
Это указывает, что параметр f
будет указателем на функцию, которая имеет void
тип возврата и которая берет сингл int
параметр. Следующая функция (print
) является примером функции, которая могла быть передана func
в качестве параметра, потому что это - надлежащий тип:
void print ( int x ) {
printf("%d\n", x);
}
Вызов функции
При вызывании функции с параметром функции, значение передал, должен быть указатель на функцию. Используйте имя функции (без круглых скобок) для этого:
func(print);
звонил бы func
, передавая функцию печати ему.
Тело функции
Как с любым параметром, func может теперь использовать имя параметра в теле функции для доступа к значению параметра. Скажем, это, func применит функцию, это передается номерам 0-4. Рассмотрите, во-первых, на что цикл был бы похож для вызова печати непосредственно:
for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
print(ctr);
}
С тех пор func
в объявлении параметра говорится, что f
название указателя на желаемую функцию, мы вспоминаем сначала, что, если f
указатель тогда *f
, вещь что f
точки к (т.е. функция print
в этом случае). В результате просто замените каждое возникновение печати в цикле выше с [1 117]:
void func ( void (*f)(int) ) {
for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
(*f)(ctr);
}
}
От [1 118] http://math.hws.edu/bridgeman/courses/331/f05/handouts/c-c++-notes.html
Этот вопрос уже имеет ответ для определения указателей функции, однако они могут стать очень грязными, особенно если Вы собираетесь быть передачей их вокруг Вашего приложения. Для предотвращения этой неприятности, я рекомендовал бы что Вы определение типа указатель функции во что-то более читаемое. Например.
typedef void (*functiontype)();
Объявляет функцию, которая возвращается пусто и не берет аргументов. Для создания указателя функции к этому типу, можно теперь сделать:
void dosomething() { }
functiontype func = &dosomething;
func();
Для функции, которая возвращает интервал и берет символ, который Вы сделали бы
typedef int (*functiontype2)(char);
и использовать его
int dosomethingwithchar(char a) { return 1; }
functiontype2 func2 = &dosomethingwithchar
int result = func2('a');
, существуют библиотеки, которые могут помочь с превращением указателей функции в хорошие читаемые типы. функция повышения библиотека является большой и определенно стоит усилия!
boost::function<int (char a)> functiontype2;
настолько более хорошо, чем вышеупомянутое.
Необходимо передать указатель функции . Синтаксис является немного громоздким, но это действительно мощно, как только Вы знакомитесь с ним.