Вы ищете термин указатель на функцию-член , но мы можем обойтись без явного указания этого типа.Проблема с вашим кодом заключается не только в том, как вы пытаетесь обратиться к функции-члену (это будет &TestClass::add
), но также в том, что вы создаете эти псевдонимы во вложенной области видимости (в if
/ else
),это означает, что они не будут видны в операторе return
.
Самое простое изменение:
auto class_func = &TestClass::add; // pick one default
if (func_name == "Subtract")
{
class_func = &TestClass::subtract;
}
else
{
assert(func_name == "Add"); // optional
}
return class_func(a, b);
Это работает, потому что функции add
и subtract
имеют точноетот же тип:
double (TestClass::*)(double a, double b)
Но да, почему эти функции не static
?Они не работают с экземпляром класса.Сделайте их static
и выше все равно будет работать, просто обратите внимание, что тип class_fun
будет простым указателем на функцию:
double (*)(double a, double b)
Теперь, когда вы знаете типы, вы можете изменитьэто таким образом, что в коде нет привилегий для одной функции перед другой:
decltype(&TestClass::add) class_func = nullptr;
if (func_name == "Add")
{
class_func = &TestClass::add;
}
else if (func_name == "Subtract")
{
class_func = &TestClass::subtract;
}
assert(class_func != nullptr);
return class_func(a, b);
Как упоминалось в комментариях, поскольку цепочка if
- else
начинает становиться длиннее, она делает большеи больше смысла использовать (хеш) карту между строками и указателями на функции.