Как вы передаете функцию в качестве параметра в C?

Оператор 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
{
    // ...
}
540
задан gsamaras 29 July 2016 в 19:09
поделиться

3 ответа

Объявление

прототип для функции, которая берет параметр функции, похож на следующее:

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

673
ответ дан andrewrk 29 July 2016 в 19:09
поделиться

Этот вопрос уже имеет ответ для определения указателей функции, однако они могут стать очень грязными, особенно если Вы собираетесь быть передачей их вокруг Вашего приложения. Для предотвращения этой неприятности, я рекомендовал бы что Вы определение типа указатель функции во что-то более читаемое. Например.

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;

настолько более хорошо, чем вышеупомянутое.

121
ответ дан roo 29 July 2016 в 19:09
поделиться

Необходимо передать указатель функции . Синтаксис является немного громоздким, но это действительно мощно, как только Вы знакомитесь с ним.

4
ответ дан saint_groceon 29 July 2016 в 19:09
поделиться
Другие вопросы по тегам:

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