2011-03-26 46 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); 
}