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); };
我想柯里化一个带有抽象参数的函数。这让我的编译器很生气:
#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); };