注:私は元の投稿を変更して、最小限の検証可能な例を作成しました。クラスメソッドをC++ 11/14のパラメータとして渡す方法は?
これまでに回答されている場合は申し訳ありませんが、見つかりませんでした。私は古いポインタから関数Cスタイルに移行しようとしています。
以下、私は、それに渡される関数を計算するクラスSolverNonTemplate
を持っています。これは匿名関数functionToEval
のために働きます。私は、functionToEval
が解決されるべき問題(構造体SetSystem
によって簡略化されて表現される)に、より多くの構造を追加し、追加するという異なるクラスのインスタンス化から渡す必要があります。
私はコンパイルエラーがあるVisual Studioのコミュニティ2015を使用しています:
Error C3867 'SetSystem::DumbSystem': non-standard syntax; use '&'
to create a pointer to member main.cpp 55.
コード:すべての
#include "stdafx.h"
#include <iostream>
#include <vector>
class SolverNonTemplate {
public:
template<typename Lambda>
void evaluateFunction(const std::vector<double>& varsToSolveValues,
Lambda&& functionToEval,
std::vector<double>& functionValsOut)
{
for (int ifunc = 0; ifunc < varsToSolveValues.size(); ++ifunc)
{
functionValsOut[ifunc] = std::forward<Lambda>(functionToEval)(varsToSolveValues, ifunc);
}
}
};
double DumbSystem(const std::vector<double>& varsToSolveValues, int indexToReturn)
{
if (indexToReturn == 0) {
return varsToSolveValues[0] * varsToSolveValues[0] - varsToSolveValues[1] * varsToSolveValues[1]; //x^2 - y^2
}
else {
return varsToSolveValues[0] * varsToSolveValues[0] * varsToSolveValues[0] - varsToSolveValues[0] + varsToSolveValues[1]; //x^3 - x*y
}
}
struct SetSystem
{
double DumbSystem(const std::vector<double>& varsToSolveValues, int indexToReturn)
{
if (indexToReturn == 0) {
return varsToSolveValues[0] * varsToSolveValues[0] - varsToSolveValues[1] * varsToSolveValues[1]; //x^2 - y^2
}
else {
return varsToSolveValues[0] * varsToSolveValues[0] * varsToSolveValues[0] - varsToSolveValues[0] + varsToSolveValues[1]; //x^3 - x*y
}
}
};
int main()
{
std::vector<double> x0Guess = { -30.0, 11.5 };
std::vector<double> fValuesOut;
fValuesOut.resize(2);
SolverNonTemplate solver;
solver.evaluateFunction(x0Guess, DumbSystem, fValuesOut);
std::cout << " using anonymous functions.." << std::endl;
std::cout << "dumbSystem f[0] = " << fValuesOut[0] << std::endl;
std::cout << "dumbSystem f[1] = " << fValuesOut[1] << std::endl;
std::cout << "now trying to use function from struct/class /n";
SetSystem system;
SolverNonTemplate solver2;
solver2.evaluateFunction(x0Guess, system.DumbSystem, fValuesOut);
return 0;
}
何かを何度も転送してはなりません。フォワーディングは、概念的には動くようなものです。 –
どういう意味ですか? functionToEvalをプレーン関数として使用します。 "別のクラスのメンバである関数"は、メソッドを呼び出すオブジェクトがある場合にのみ意味があります。 – odelande
[mcve]を指定してください。コンパイラエラーが含まれています。あなたがしていることは完全にはわかりません。 – Barry