Curry 一个在 CPP 中接受抽象参数的函数

Curry a function that takes abstract arguments in CPP

我想柯里化一个带有抽象参数的函数。这让我的编译器很生气:

#include <functional>

class MyAbstractParentClass {
public:
    virtual void someVirtualMethod() = 0;
};

class MyConcreteChildClass: public MyAbstractParentClass {
public:
    virtual void someVirtualMethod() override {}
};

void myFunction(const MyAbstractParentClass& myAbstractObject) {}


int main(int argc, const char * argv[]) {
    
    const MyAbstractParentClass& myChildObject = MyConcreteChildClass();
    
    myFunction(myChildObject); // all good here
    
    const auto myCurriedFunction = std::bind(myFunction, myChildObject); // error here
    
    myCurriedFunction(); // we never get here
}

有没有一种方法可以在不借助指针的情况下完成这项工作?

如果要柯里化一个函数,可以使用boost::hana::curry,如下图:

#include <boost/hana/functional/curry.hpp>
#include <iostream>

int f(int x,int y,int z) {
    return x + y + z;
};

int main {
    auto constexpr f_curried = boost::hana::curry<3>(f);
    auto constexpr f12 = f_curried(1)(2);
    std::cout << f12(3) << '\n';
}

但是,在您的情况下,您似乎是在“部分”应用该函数,而不是柯里化它。我使用引号是因为您实际上是在向它传递它需要的所有参数,而您只是在延迟调用。为此,您可以使用 <boost/hana/functional/partial.hpp> header 中的 boost::hana::partial (但您仍然必须将 object 包装在引用中,如 the other answer 所示实际上告诉你原始代码中的错误):

    using boost::hana::partial;
    const auto myCurriedFunction = partial(myFunction, std::ref(myChildObject));

std::bind 复制其参数,您可以使用 std::reference_wrapper

的引用
const auto myCurriedFunction = std::bind(myFunction, std::ref(myChildObject));

或使用 lambda:

const auto myCurriedFunction = [&](){ return myFunction(myChildObject); };