尝试通过使用具有不同方法签名的 std::function 来理解多态 类
Trying to understand polymorphic classes with the use of std::function with different method signatures
我是新手,我想举一个例子来帮助我理解多态性、类型擦除和 std::function.
的使用
我试图通过创建这个例子来理解 class,它可以接受一个基值,然后是一个 std::function,然后是对基值的许多数学运算之一。
double multiplyValue(double baseVal, double multiplyBy) {
return baseVal * multiplyBy;
}
double divideValue(double baseVal, double divideBy) {
return baseVal / divideBy;
}
double subtractFromDividedValue(double baseVal, double subtract, double divideBy) {
return subtract - (baseVal / divideBy);
}
double inverseSubtract(double baseVal, double subtract) {
return -(baseVal - subtract);
}
class PrintValue
{
public:
PrintValue(int baseVal, std::function<double(double, double)> modifierFunc) {
this->baseVal = baseVal;
this->modifierFunc = modifierFunc;
}
void print() {
std::cout << "Value : " << modifierFunc(baseVal, 2) << "\n";
}
private:
int baseVal;
std::function<double(double, double)> modifierFunc;
};
int main()
{
PrintValue multiplyVal(2, multiplyValue);
multiplyVal.print();
PrintValue divideVal(2, divideValue);
divideVal.print();
system("pause");
return 0;
}
我的 PrintVal class 可以使用 multiplyValue divideValue 和 inverseSubtract,因为它们具有相同的方法签名——但是当我希望我的 "PrintValue" class 能够接受 subtractFromDividedValue 函数时...这是我感到困惑的地方!
此外,我注意到我已经将“2”硬编码为传递给 print() 函数中的 modifierFunc 的方法参数。
我也希望能够动态地将可变数量的方法参数传递给 class,但在这里我感到困惑,因为 subtractFromDividedValue 的参数比其他数学函数多。所以我想我只需要创建一个接口,并为所有可能的参数排列重载 class,对吗?
最终我只想要一个 class,我可以将一个函数传递给动态修改 "baseValue"...
干杯
So I think I just need to make an interface, and overload the class for all the possible argument permutations, is that correct?
有很多方法可以做到,最好是尝试一下,看看结果如何 - 如果您认为某件事很有希望,但遇到困难,请在这里提出一个新问题。作为一种方法的示例,您可以使您的打印机根据 baseVal
进行修改,使用 vector
提供的可变数量的参数,以及应用转换的函数...
PrintValue(double baseVal, std::vector<double> otherParameters, std::function<double(double, std::vector<double>)> modifierFunc)
: baseVal_{baseVal}, otherParams_{std::move(otherParameters)}
{ }
...您可以创建合适的函数,例如...
double subtractFromDividedValue(double baseVal, const std::vector<double>& params) {
double subtract = params.at(0), divideBy = params.at(1);
return subtract - (baseVal / divideBy);
}
为了更加灵活,您可以在调用时添加参数 print
:
void print(const std::vector<double>& extraParams) {
if (extraParams.size())
{
std::vector<double> allParams{ otherParams_.begin(), otherParams_.end() };
for (double p : extraParams)
allParams.push_back(p);
std::cout << "Value : " << modifierFunc(baseVal, allParams) << "\n";
}
else
std::cout << "Value : " << modifierFunc(baseVal, otherParams_) << "\n";
}
我是新手,我想举一个例子来帮助我理解多态性、类型擦除和 std::function.
的使用我试图通过创建这个例子来理解 class,它可以接受一个基值,然后是一个 std::function,然后是对基值的许多数学运算之一。
double multiplyValue(double baseVal, double multiplyBy) {
return baseVal * multiplyBy;
}
double divideValue(double baseVal, double divideBy) {
return baseVal / divideBy;
}
double subtractFromDividedValue(double baseVal, double subtract, double divideBy) {
return subtract - (baseVal / divideBy);
}
double inverseSubtract(double baseVal, double subtract) {
return -(baseVal - subtract);
}
class PrintValue
{
public:
PrintValue(int baseVal, std::function<double(double, double)> modifierFunc) {
this->baseVal = baseVal;
this->modifierFunc = modifierFunc;
}
void print() {
std::cout << "Value : " << modifierFunc(baseVal, 2) << "\n";
}
private:
int baseVal;
std::function<double(double, double)> modifierFunc;
};
int main()
{
PrintValue multiplyVal(2, multiplyValue);
multiplyVal.print();
PrintValue divideVal(2, divideValue);
divideVal.print();
system("pause");
return 0;
}
我的 PrintVal class 可以使用 multiplyValue divideValue 和 inverseSubtract,因为它们具有相同的方法签名——但是当我希望我的 "PrintValue" class 能够接受 subtractFromDividedValue 函数时...这是我感到困惑的地方!
此外,我注意到我已经将“2”硬编码为传递给 print() 函数中的 modifierFunc 的方法参数。
我也希望能够动态地将可变数量的方法参数传递给 class,但在这里我感到困惑,因为 subtractFromDividedValue 的参数比其他数学函数多。所以我想我只需要创建一个接口,并为所有可能的参数排列重载 class,对吗?
最终我只想要一个 class,我可以将一个函数传递给动态修改 "baseValue"...
干杯
So I think I just need to make an interface, and overload the class for all the possible argument permutations, is that correct?
有很多方法可以做到,最好是尝试一下,看看结果如何 - 如果您认为某件事很有希望,但遇到困难,请在这里提出一个新问题。作为一种方法的示例,您可以使您的打印机根据 baseVal
进行修改,使用 vector
提供的可变数量的参数,以及应用转换的函数...
PrintValue(double baseVal, std::vector<double> otherParameters, std::function<double(double, std::vector<double>)> modifierFunc)
: baseVal_{baseVal}, otherParams_{std::move(otherParameters)}
{ }
...您可以创建合适的函数,例如...
double subtractFromDividedValue(double baseVal, const std::vector<double>& params) {
double subtract = params.at(0), divideBy = params.at(1);
return subtract - (baseVal / divideBy);
}
为了更加灵活,您可以在调用时添加参数 print
:
void print(const std::vector<double>& extraParams) {
if (extraParams.size())
{
std::vector<double> allParams{ otherParams_.begin(), otherParams_.end() };
for (double p : extraParams)
allParams.push_back(p);
std::cout << "Value : " << modifierFunc(baseVal, allParams) << "\n";
}
else
std::cout << "Value : " << modifierFunc(baseVal, otherParams_) << "\n";
}