Я хочу получить доступ к функции, которая возвращает пару через указатель, определенный в соответствии с вводом во время выполнения.
Пример кода:
int main() {
struct Math::strinfo si; // This was what caused the problem - See answer and question edit
typedef std::pair<double, string> (*FuncChosen)(struct strinfo *si, double first, double second);
FuncChosen p = Math::calcSpeed;
}
calcSpeed выглядит так и находится в пространстве имен «Math»:
namespace Math {
struct strinfo
{
string strformula;
string chosenCalcStr;
};
std::pair<double, string> calcSpeed(struct strinfo *si, double distance, double time)
{
si->strformula = "Speed = distance / time";
si->chosenCalcStr = "Speed";
return make_pair(distance/time, std::to_string(distance) + " / " + std::to_string(time));
}
}
Я не могу назначить FuncChosen p для calcSpeed, потому что он имеет «lvalue типа std::pair». Приведенный выше код работал нормально, когда calcSpeed возвращал значение типа double. Является ли этот метод несовместимым с функциями, возвращающими пару, и если да, то существуют ли какие-либо обходные пути, не связанные с изменением типа возвращаемого значения функции с пары на что-то другое?
Причина, по которой я хочу назначить указатель во время выполнения, заключается в том, чтобы я мог выбрать, использовать ли calcSpeed или ряд других функций с такими же параметрами и типами возвращаемого значения в соответствии с вводом, и единственный способ сделать это без условных выражений — с помощью этого метода (я считать).
Заранее спасибо,
Изменить: полный код ошибки FYI:
SDT_Test/main.cpp:63:16: Cannot initialize a variable of type 'FuncChosen' (aka 'std::pair<double, string> (*)(struct strinfo *, double, double)') with an lvalue of type 'std::pair<double, string> (struct strinfo *, double, double)': type mismatch at 1st parameter ('struct strinfo *' (aka 'strinfo *') vs 'struct strinfo *' (aka 'Math::strinfo *'))
Редактировать 2:
Я забыл включить строку моего кода, которая выдала бы проблему. Ответ ниже показывает, что проблема была с «struct strinfo *si» в typedef — должно быть «Math::strinfo *si».
std::string
в паре? Почему бы также не ввести std::pair? - person Slava   schedule 05.11.2014strInfo
. - person PaulMcKenzie   schedule 05.11.2014typedef std::pair<double, string> sometype;
, а затем используюsometype
- person Slava   schedule 05.11.2014