gpt4 book ai didi

c++ - 创建模板内部 lambda 函数?

转载 作者:行者123 更新时间:2023-11-30 03:14:17 24 4
gpt4 key购买 nike

我一直在尝试用 C++ 解决下一个函数式问题:

template <typename T>
auto createFunction(T& ClosuredData) {
template <typename U>
return [&](function<void(T&, U&)> Callback) {
return [&](U& DataFromCallback) {
Callback(ClosuredData, DataFromCallback);
};
};
};

// example use
struct Person {
string name{"Foo"};
int age = 20;
}
Person foo{};
auto mutate = createFunction(foo);
auto changeAge = mutate<int>([](Person& person, int& age) {
person.age = age;
})

changeAge(20)

所以基本上是一个带有内部模板 lambda 的模板函数创建器。但当然,据我所知,内部模板在 C++ 中是不可能的。我尝试将回调设为自动类型,但当然那样我无法推断 DataFromCallback 导致错误的类型安全。

我能否在不引入类/结构的情况下以某种方式实现适当的类型安全?

编辑:我看到的“解决方案”之一是使用自动类型而不是功能类型:

template <typename T>
auto CreateFunction(T& ClosuredData) {
return [&](auto Callback) {
return [&, Callback](auto DataFromCallback) {
Callback(ClosuredData, DataFromCallback);
};
};
};

这真的很酷,但给人一种错误的类型安全感,例如:

{
Person person{};
auto personMutator = CreateFunction(person);
auto changeAge = personMutator([](Person& person, int age) {
person.age = age;
});

changeAge(""); // Would not throw an error in this line, but at an upper stack

changeAge(any); // same stuff
}

最佳答案

似乎您可以使用自 C++14 以来可用的通用 lambda(它基本上用作内部模板):

template <typename T>
auto CreateFunction(T& ClosuredData) {
return [&](auto Callback) {
return [&, Callback](auto DataFromCallback) {
Callback(ClosuredData, DataFromCallback);
};
};
};

关于c++ - 创建模板内部 lambda 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57944707/

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