2011-03-26 54 views
2

在C++中,你可以创建一个“功能型”与例如:如何使用“功能类型”?

void main() { 
int a(); 
} 

而一个有型“INT()”,但有可能使用它?我甚至不能传递'a'作为模板参数(但我可以通过“int()”作为一个参数)

+4

我想你混淆了*函数类型*和*功能*。 'a'是后者,而不是前者,就像'123'是一个整数(但不是整型),'int'是一个整数类型(但不是整数)。 – 2011-03-26 01:49:07

+0

猜测我很困惑,因为当我尝试使用sizeof()时,gcc给出了这个错误:错误:ISO C++禁止将'sizeof'应用于函数类型表达式 – user647445 2011-03-26 02:10:45

+0

是的。 'a'是一个表达。表达式*有*函数类型;也就是说,它的值的类型是一个函数类型;但表达式*不是函数类型。这有帮助,还是仅仅增加混淆? – 2011-03-26 10:58:57

回答

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 */ 
} 
+0

谢谢,解决了我的一个问题! – user647445 2011-03-26 02:11:36

3

首先,更正:这不是“函数类型”的定义。这是一个函数的声明

其次,确保您可以使用它:

void main() { 
    int a(); 

    a(); // call the function! 
} 

当然,链接器会抱怨没有函数的任何位置定义int a(),但这是另一个问题完全。

+0

谢谢!你说得对,我在使用sizeof时误导了gcc的错误 – user647445 2011-03-26 02:13:29

0

您需要定义int a();这是一个向前声明,这意味着你可以调用内主一()(),而不必放弃功能main()之上的原型。

#include <iostream> 

using namespace std; 

int main(int argc, char *argv[]) { 
     int a(); 
     a(); 
     return 1; 
} 

int a() { 
     cout<<"Hello world"<<endl; 
} 
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 
} 
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(); 
} 
0

现在,其他人已经指出你在那里声明一个函数,而不是一个类型。没有必要进一步深入。

此外,你不能声明或定义“新”功能类型,只有函数(见凯文的回应)。 当然,他们仍然存在,只是你无法定义他们,你也不必。就像指针或引用类型一样,您可以在需要时“使用”它们。

但是,您可以键入一个函数类型。然后,您可以使用别名(类型定义)的指针申报功能,或者该类型的(鲜为人知),甚至功能:

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); 
}