使用 typedef 声明函数有什么意义?
What is the point in using typedef to declare a functon?
我有点困惑为什么我可以使用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 的场景?
我只能想到它的应用,但是,我从未见过它在使用中。
例如隐藏实现名称。想象你有一个库函数,这个函数必须是可内联的,所以你在头文件中提供它的实现。它还需要调用其他函数。所以你的库头文件(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
的一个原因是在本地 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_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;
}
请注意,我不提倡任何这样的代码。我只是在扮演魔鬼鼓吹者来回答这个问题为什么要这样做。
首先,这个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
我有点困惑为什么我可以使用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 的场景?
我只能想到它的应用,但是,我从未见过它在使用中。
例如隐藏实现名称。想象你有一个库函数,这个函数必须是可内联的,所以你在头文件中提供它的实现。它还需要调用其他函数。所以你的库头文件(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
的一个原因是在本地 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_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;
}
请注意,我不提倡任何这样的代码。我只是在扮演魔鬼鼓吹者来回答这个问题为什么要这样做。
首先,这个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