Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用typedef声明functon有什么意义?_C++_Function_Typedef - Fatal编程技术网

C++ 使用typedef声明functon有什么意义?

C++ 使用typedef声明functon有什么意义?,c++,function,typedef,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;

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

}
intadd(inta,intb){
返回a+b;
}
int Mult(int a,int b){
返回a*b;
}
typedef int func(int,int);
int main(int argc,char*argv[]){
func-Add;

cout我能想到它的唯一应用,然而,我从未见过它在使用中

例如,实现名称隐藏。假设您有一个库函数,并且该函数必须是内联的,因此您在头文件中提供了它的实现。它还需要调用其他函数。因此,您的库头文件(
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\u internal\u stuff
函数 可见,因此您最终将包含
internal_stuff.h
,它声明了这两个函数。但是现在,它们可以在包含
library.h
的任何文件中调用,您可能不希望这样

避免包含
internal_stuff.h
的一个原因是本地的delcaring函数:

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\u internal\u 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;
}

请注意,我不是在提倡任何这样的代码。我只是在扮演魔鬼代言人的角色来回答为什么要这么做的问题。

首先,这个
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; });
}

您可以稍后使用它在某处传递指向此函数的指针:
void foo(func*p_func)
而不是
void foo(int(*p_func)(int,int))
func*foo(void)
而不是
void(*foo(void))(int,int)
在一般类型中,def允许简化像
char(&(foo:*[1])这样的胡言乱语声明(foo_t(*)[2])&[3]
并赋予语义。Re:“重点是什么…”不知道。在这个代码中没有任何意义。在其他代码中,它是用来使编写代码更容易的,比如声明函数指针。@ VTT-是的,但是如果要通过指针,则应该将TyPulf定义为指针。顺便说一下,现在应该考虑使用声明替换“Type”。事情:“如果你有20个do_internal_stuff函数,它可能会变得有点乏味。”:我可以使用这个类型别名作为指向函数的指针,并使其成为向量的类型,然后我可以将指针推送到函数:
std::vector vpFn{20};vpFn[0]=Add;vpFn[1]=Mult;cout
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