你怎么用“功能类型”?

时间:2011-03-26 01:44:07

标签: c++

在C ++中,您可以创建一个“函数类型”,例如:

void main() {
 int a();
}

a的类型为“int()”,但可以使用它吗?我甚至不能将'a'作为模板参数传递(但我可以将“int()”作为一个传递)

6 个答案:

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