在C ++中,您可以创建一个“函数类型”,例如:
void main() {
int a();
}
a的类型为“int()”,但可以使用它吗?我甚至不能将'a'作为模板参数传递(但我可以将“int()”作为一个传递)
答案 0 :(得分:5)
您没有声明“功能类型”。你正在宣布一个功能。这与您通常在文件范围中执行的操作相同,但在这种情况下,您可以在本地范围内执行此操作
int main() {
int a(); /* declare function `a` */
...
int i = a(); /* call function `a` */
}
int a() { /* define function `a` */
/* whatever */
}
是的,您可以将其作为模板参数传递。它必须是非类型参数,当然
template <int A()> void foo() {
A(); /* call the function specified by the template argument */
}
int main() {
int a(); /* declare function `a` */
foo<a>(); /* pass it as a template argument */
}
答案 1 :(得分:3)
首先,修正:这不是“功能类型”的定义。这是函数的声明。
其次,确定你可以使用它:
void main() {
int a();
a(); // call the function!
}
当然链接器会抱怨在任何地方都没有定义函数int a()
,但这完全是另一个问题。
答案 2 :(得分:1)
那是原型声明。
int main(int argc, char **argv) {
int a();
int result = a();
}
int a() { return 42; }
也许你真的是指一个函数指针?
int target() { return 42; }
int main(int argc, char **argv) {
int (*a)();
a = target;
int result = a();
}
答案 3 :(得分:0)
你需要定义int a();
这是一个前向声明,这意味着你可以在main()中调用一个(),而不必在main()上面给出函数原型。
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
int a();
a();
return 1;
}
int a() {
cout<<"Hello world"<<endl;
}
答案 4 :(得分:0)
您可以通过重载函数调用运算符operator()来创建函数类型。例如:
class MyF {
int x_;
public:
MyF(int x) {
x_ = x;
}
public:
void operator()(int y) {
// do something with x, y.
}
}
int main() {
MyF f(3); // create function object
f(4); // call it
}
答案 5 :(得分:0)
现在,其他多个人已经指出你在那里声明一个函数,而不是一个类型。无需深入研究。
此外,您不能声明或定义“新”函数类型,只能编写仿函数(请参阅Kevin的回复)。 当然它们仍然存在,只是你不能定义它们而你也不必。就像指针或引用类型一样,您可以在需要时“使用”它们。
但是你可以输入一个函数类型。然后,您可以使用该别名(typedef)来声明指向函数的指针,或者(不太知道),甚至是该类型的函数:
typedef int IntToIntFn(int);
IntToIntFn foo; // same as 'int foo(int);'
IntToIntFn* bar; // same as 'int (*bar)(int);'
int main()
{
foo(42);
bar = &foo;
bar(42);
}