gpt4 book ai didi

c++ - 模板 C++0x lambda 函数……还是仿函数/谓词?

转载 作者:太空狗 更新时间:2023-10-29 20:31:00 25 4
gpt4 key购买 nike

我最近升级了我的 g++这样我就可以享受 lambda 函数了。一切都很好,我非常感谢那些使 C++ 尤其是 gcc 成为可能的人。只有一件事我似乎无法解决——如何将 lambda 的参数模板化?下面是用于演示问题的 lambda 用法的基本示例。

示例 #1,一切都很美味:

#include <cstdio>

struct bar {
bar () {}

void say () {
printf ("bar::say()\n");
}

void say () const {
printf ("bar::say() const\n");
}
};

template <typename T>
void do_work (const T & pred) {
bar b;
pred (b);
}

int main () {
do_work ([] (bar & b) { b.say (); });
}

现在,假设 do_work现在使用不同的参数类型调用谓词两次。所以这里是示例 #2:

#include <cstdio>

struct foo {
foo () {}

void say () {
printf ("foo::say()\n");
}

void say () const {
printf ("foo::say() const\n");
}
};

struct bar {
bar () {}

void say () {
printf ("bar::say()\n");
}

void say () const {
printf ("bar::say() const\n");
}
};

template <typename T>
void do_work (const T & pred) {
const foo f;
bar b;
pred (f);
pred (b);
}

int main () {
do_work ([] (auto & b) { b.say (); });
}

备注auto关键词。我也尝试就地模板化它。不要尝试用 gcc 编译它,这是我得到的:

./test.cpp:31:5: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.

但是你明白了。理论上我可以用新的函数声明风格来解决它,但这不是重点。这是我真正想做的,但使用简化的语法( foobardo_work 为简单起见被剥离):

struct pred_t {
pred_t () = default;

template <typename T>
void operator () (T && obj) const {
obj.say ();
}
};

int main () {
do_work (pred_t ());
}

有没有办法,或者至少有计划,添加对非完全特化的 lambda 函数的支持,以便它们的行为有点像 template <typename T> operator () (T &&) 的谓词? ?我什至不知道如何命名,也许是 lambda 谓词?请让我知道你的想法!谢谢!

最佳答案

这些被讨论为“多态 lambda”,并被拒绝,因为它给概念提案带来了问题。

去年 2009 at the Frankfurt meeting ,概念提案被工作文件投票淘汰,但 C++0x 不再考虑多态 lambda。

参见 C++0x and the Lack of Polymorphic Lambdas .

关于c++ - 模板 C++0x lambda 函数……还是仿函数/谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5289834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com