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

标签 c++ templates lambda functional-programming

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

相关文章:

c++ - 在哪里使用 std::variant 而不是 union ?

c++ - 带模板的 typedef

c++ - 默认模板参数偏特化

python - 减少 - Python

java - Java 中的 Lambda 参数

java - 从传入对象构造函数的 lambda 访问对象

c++ - win32 : WM_PAINT calls but not supposed to be!

c++ - 使用 C++ 创建的 ListView 控件末尾未创建项目

c# - 如何关闭打开的串口?

c++ - C++中的模板成员函数