【问题标题】:Is it possible to specify a function directly in a struct declaration in C++?是否可以直接在 C++ 的结构声明中指定函数?
【发布时间】:2011-08-03 08:31:49
【问题描述】:

例如:

struct Foo
{
    int bar;
    int (*baz)(int);
};

int testFunc(int x)
{
    return x;
}

Foo list[] = {
    { 0, &testFunc },
    { 1, 0 } // no func for this.
};

在本例中,我宁愿将函数直接放入 list[] 初始化程序,而不是使用指向在别处声明的函数的指针;它将相关的代码/数据保存在同一个地方。

有没有办法做到这一点?我尝试了所有我能想到的语法,但无法让它发挥作用。

【问题讨论】:

  • 这看起来非常接近动态调度的手动实现......你考虑过使用继承吗?

标签: c++ struct function-pointers


【解决方案1】:

如果你的意思是这样的:

Foo list[] = {
    { 0, int (*)(int x) { return x;} },
    { 1, 0 } // no func for this.
};

那么,不,这是不可能的。你说的是anonymous functions,C++ 还不支持的东西(截至 2011 年 8 月)。

C++0x 正在添加对lambda functions 的支持,这几乎是一回事,您的语法可能类似于:

Foo list[] = {
    { 0, [](int x) { return x; } },
    { 1, 0                       }
};

但是,如果您的目的只是为了让代码和数据保持接近,那么只需让它们保持接近即可(同一个 C 源文件,代码紧邻数据之前)。

【讨论】:

  • 不幸的是,该列表可能非常大,并且可能具有多种功能,我实际上可以实现的最接近的距离不会那么接近。我想我现在只能忍受它,或者重构。
  • 请注意,lambda(匿名函数)具有完全不同的(未知)类型,因此您必须更改结构的定义。在这种情况下,struct Foo { int bar; std::function<int (int)> baz; }; 行中的某些内容又意味着该类型不再是 POD(甚至不是标准布局)
  • @Flynn,我会考虑将它们放在他们自己的源文件中,并在该文件中列出列表和相关函数(仅此而已)。您甚至可以根据每个数组元素中的第一个参数调用您的函数fn0fn1 等等(以便能够通过编辑器搜索轻松找到它们)。
【解决方案2】:

在 C++0x 中,您可以使用 lambdas 将数据和代码保持在一起,但这会使代码难以阅读和维护。

【讨论】:

    【解决方案3】:

    您要查找的是anonymous functions,它在 C 或 C++ 中不存在(尽管 Clang 非官方支持它,它将在 C++0x 中添加。)

    【讨论】:

    • 其他编译器支持匿名函数:Intel是第一个(AFAIK),然后是VS2010,g++...
    猜你喜欢
    • 2023-01-12
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    相关资源
    最近更新 更多