gpt4 book ai didi

c++11 - C++ 将 lambda 传递给模板参数

转载 作者:行者123 更新时间:2023-12-05 00:52:51 25 4
gpt4 key购买 nike

如何将 lambda 作为模板参数传递。
例如这个代码

template<void (*callback)()>
void function() {
callback();
}

int main() {
function<[]() -> void { std::cout << "Hello world\n"; }>();
}

失败并显示错误“'function' 的模板参数无效,预期编译时常量表达式”。
我做错了什么。

编辑
我想实现这样的东西
template<typename T,
T (*deserializer)(buffer *data),
void (*serializer)(T item, buffer *data)>
class Type {
public:
T item;

Type(T item) : item(item) {
}

Type(buffer *data) {
deserialize(data);
}

void serialize(buffer *data) {
serializer(item, data);
}

void deserialize(buffer *data) {
deserializer(data);
}
};

typedef Type<int, [](buffer* data) -> int { return -1; }, [](int item, buffer* data) -> void {}> IntType

typedef Type<long, [](buffer* data) -> long { return -1; }, [](long item, buffer* data) -> void {}> LongType

最佳答案

C++14 中的 Lambda,包括它们到函数指针的转换,不是 constexpr。

在 C++17 中,this is going to change .据我所知,没有实现该功能的稳定编译器(如果您找到了,能否在下面的评论中提及?)。

在那时候

constexpr auto tmp = []() -> void { std::cout << "Hello world\n"; };
function<+tmp>();

肯定会工作。我不确定是否
function<+[]() -> void { std::cout << "Hello world\n"; }>()

会工作;在未求值的上下文和模板参数列表中,有一些关于 lambdas 的规则,这些规则可能与 constexpr 分开。 lambda 问题,可能适用于此。

我们可以用 C++14 破解它。

创建一个模板类,用于存储 lambda 的静态副本并公开具有相同签名 ( f_ptr ) 的静态函数,该函数调用 lambda 的该静态副本。

使用您的 lambda 全局实例化一次。

传递指向 f_ptr 的指针到您的模板。

所以:
template<class L> struct stateless; // todo
template<class L> stateless<L> make_stateless(L l){return std::move(l);}

auto foo = make_stateless( []() -> void { std::cout << "Hello world\n"; } );

function< &foo::f_ptr >();

这几乎肯定不是您想要的。

关于c++11 - C++ 将 lambda 传递给模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41987175/

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