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

问题描述 投票:6回答:2

我有点困惑为什么我可以使用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;

}

什么是上面的点func Add;虽然我可以直接打电话给Add()

  • 有人可以解释我应该在函数上使用typedef的场景吗?
c++ function typedef
2个回答
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)>的替代方法:这更强大。它可以允许您将任何类型的callable作为参数传递,例如可调用对象而不是函数:

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
投票

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

一个例子可能是实现名称隐藏。想象一下,你有一个库函数,这个函数必须是可内联的,所以你在头文件中提供它的实现。它还需要调用其他函数。所以你的库头文件(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的文件中调用,你可能不想要这个。

避免包括qazxsw poi的一个原因是在本地声明函数:

internal_stuff.h

如果你有20个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; } 函数,它可能会变得有点乏味。比你想要的还要多

do_internal_stuff

请注意,我不是在提倡任何类似的代码。我只是扮演恶魔主张回答为什么这样做的问题。

© www.soinside.com 2019 - 2024. All rights reserved.