我一直在尝试用 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/