Какой смысл использовать typedef для объявления функции? - PullRequest
6 голосов
/ 15 апреля 2019

Я немного озадачен тем, почему я могу использовать typedef для объявления функций. Вот мой пример:

int Add(int a, int b) {
    return a + b;
}

int Mult(int a, int b) {
    return a * b;
}


typedef int func(int, int);


int main(int argc, char* argv[]){

    func Add;
    cout << Add(5, 57) << endl;

}

Какой смысл выше int func Add; Пока я могу позвонить Add() напрямую?

  • Может кто-нибудь объяснить сценарий, где я должен использовать typedef для функций?

Ответы [ 2 ]

7 голосов
/ 16 апреля 2019

Прежде всего, этот typedef здесь совершенно бесполезен.

Но это может иметь смысл, если Add() будет определено в другом модуле компиляции. Основным преимуществом будет предоставление предопределенной подписи функций, которую вы будете часто использовать. Затем вы можете использовать его во втором модуле компиляции, чтобы объявить Add() либо на локальном уровне функции, использующей его (ваш пример), либо на глобальном уровне.

Как говорится, более современный способ выразить то же самое:

using func = int (int, int);    //instead of typedef 

Более интересный вариант использования этой функции - это когда у вас есть много функций, которые предназначены для взаимозаменяемости, и которые вы хотите передать в качестве параметра, какой из них использовать:

void test(int a, int b, func f) {
    cout << f(a, b) << endl;
}

int main(int argc, char* argv[]){
    test (5, 57, Add);
    test (18,2,Mult);
    test (15,12, [](int a, int b)->int { return 2*a-b; });
}

Но если вам нравится это делать, подумайте над альтернативой использования std::function<int(int,int)>: это более мощно. Это может позволить вам передавать в качестве аргументов любой тип вызываемых объектов, например вызываемый объект, а не функцию:

class X {
    int c; 
public: 
X (int c=0) : c(c) {};
int operator()(int a, int b) { return 2*a+b+c; }    
};

X g(2);  // g is an object of class x, intialised with 2
test (18,2,g);  // does work with function but not with simple typedef
3 голосов
/ 15 апреля 2019

Я могу думать только о применении этого, однако я никогда не видел его в использовании.

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

inline int do_stuff() {
    int a = do_internal_stuff1(10, 15, 25);
    int b = do_internal_stuff2(10, 15, 25);
    return a + b;
}

Чтобы это работало, объявление функций do_internal_stuff должно быть видимым, так что вы в конечном итоге включите internal_stuff.h, который объявляет эти две функции.Но теперь они могут вызываться в любом файле, который включает library.h, и вы, возможно, этого не захотите.

Одной из причин, по которой стоит не включать internal_stuff.h, будет локальное удаление функций:

inline int do_stuff() {
    int do_internal_stuff1(int, int, int);
    int do_internal_stuff2(int, int, int);
    int a = do_internal_stuff1(10, 15, 25);
    int b = do_internal_stuff2(10, 15, 25);
    return a + b;
}

Если у вас есть 20 do_internal_stuff функций, это может стать немного утомительным.Чем вы, возможно, захотите

inline int do_stuff() {
    typedef int internal_func(int, int, int);
    internal_func do_internal_stuff1, do_internal_stuff2, ...;
    int a = do_internal_stuff1(10, 15, 25);
    int b = do_internal_stuff2(10, 15, 25);
    return a + b;
}

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

...