使用typedef声明函数的意义是什么?

时间:2019-04-15 20:33:28

标签: c++ function typedef

我对为什么可以使用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 个答案:

答案 0 :(得分:7)

首先,此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

答案 1 :(得分:3)

我只能想到它的应用,但是我从未见过它的使用。

示例可能是实现名称隐藏。假设您有一个库函数,并且该函数必须是可内联的,因此可以在头文件中提供它的实现。它还需要调用其他函数。因此,您的库头文件(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;
}

请注意,我不主张使用此类代码。我只是在扮演魔鬼提倡者来回答问题为什么这样做