功能定义和功能类型

时间:2010-10-26 10:57:35

标签: c++

我有以下代码按预期工作:

#include <iostream>

using namespace std;

typedef int (TMyFunc)(int);

TMyFunc* p;

int x(int y)
{
    return y*2;
}

int main()
{
    p = &x;
    cout << (*p)(5) << endl;
}

我想要做的是跳过定义x并直接定义p。像

这样的东西

TMyFunc p; p(y){return y*2;}

这可能吗?如果是这样我该怎么办?如果不是为什么?

编辑:

看到答案后,我想我应该澄清:我希望这个定义是分开的。即函数定义将在共享对象中。应用程序将通过dlsym获取指向该函数的函数指针。我想要一个函数对象。我想要知道我是否可以使用其共享对象和应用程序共同提供的头文件类型来定义函数。我希望这是正确的:)。

EDIT2:对于sbi:)

它位于应用程序和共享对象中包含的标头中:

#define FNAME_GET_FACTORY       "GetFactory"
#define FNAME_GET_FUNCTION_IDS  "GetFunctionIDs"
#define FNAME_GET_PLUGIN_INFO   "GetPluginInfo"

typedef FunctionFactory* (*TpfGetFactory)();
typedef size_t (*TpfGetFunctionIDs)(int**);
typedef PluginInfo* (*TpfGetPluginInfo)();

在应用程序中,会出现类似的情况:

TpfGetFactory pF = (TpfGetFactory)dlsym(pHandle, FNAME_GET_FACTORY);
//Use pF for anything

现在,要做到这一点,我必须在共享对象中定义GetFactory如下:

extern "C" FunctionFactory* FNAME_GET_FACTORY(){//CODE}

暂时忘记extern "C"部分,我可以使用已定义的类型TpfGetFactory定义此函数吗? (这不是我知道的一个大问题 - 但我很好奇是否有可能:))。我想要的是共享对象中的这样的东西:

TpfGetFactory f;
f(){//Implementation}

EDIT3:

我的尝试:

#include <iostream>

using namespace std;

typedef int (TF)(int);

TF f;

f(int x)
{
    return x*2;
}

int main()
{
    x(3);
}

main.cpp:9: error: ISO C++ forbids declaration of ‘f’ with no type
main.cpp: In function ‘int main()’:
main.cpp:16: error: ‘x’ was not declared in this scope

4 个答案:

答案 0 :(得分:4)

有可能在C ++ 1x中,下一个C ++标准,通常预计明年(那将使它成为C ++ 11)。它允许这样:

auto p = [](int y){return y*2;};

这取决于auto被赋予了新的含义(“从初始化它的表达式中自动推断出该变量的类型”)和新的lambda函数(允许动态创建函数)。

您的编译器实际上可能已经支持此功能。

答案 1 :(得分:2)

这对我来说很好,使用当前的C ++ 03标准:

typedef int (TMyFunc)(int);

TMyFunc* p;

int test()
{
    struct LocalClass
    {
        static int functionLocal(int y)
        {
            return 2;
        };
    };

    LocalClass localClass;
    p = &(LocalClass::functionLocal);
}

但是,写作可能比你想简化的更复杂;-), 但它可以工作,你可以在本地定义你的功能。

以下是有关local classes

的一些文档

答案 2 :(得分:0)

这可以通过lambdas在下一个C ++标准中实现。但是,在当前的标准中,不可能在另一个函数中定义一个函数。

答案 3 :(得分:0)

不直接在C ++ 98中。

对于标准C ++,即C ++ 98,请查看例如: Boost Lambda库。{它可以让你写出像

这样的表达式
for_each(a.begin(), a.end(), std::cout << _1 << ' ');

C ++ 0x增加了对lambda表达式的直接支持。

干杯&amp;第h。,