【发布时间】:2019-05-20 06:38:56
【问题描述】:
我在 C++ 中有一个与此示例问题类似的问题。在这种情况下,我有两个具有相同接口的成员函数。根据传递给超级函数的字符串中的信息,我想将两个成员函数之一分配给变量class_func。有没有办法做到这一点?
// test.hpp
class TestClass
{
public:
double master_function(double a, double b, std::string func_name);
private:
double add(double a, double b);
double subtract(double a, double b);
};
// test.cpp
double TestClass::master_function(double a, double b, std::string func_name)
{
if (func_name == std::string("Add") const auto& class_func = add;
else const auto& class_func = subtract;
return class_func(a, b);
}
// =========================================================================
double TestClass::add(double a, double b)
{
return a + b;
}
// =========================================================================
double TestClass::subtract(double a, double b)
{
return a - b;
}
换句话说,我试图将成员函数add 或subtract 分配给名称class_func,因此master_function 中if 语句下面的代码可以是统一的,无论哪个函数用户想要使用。在下面显示的表格中,我收到错误Reference to non-static member function must be called out,但我不完全确定这意味着什么或如何解决它。此外,我使用的是 C++17 编译器,所以如果有一种最适合 C++17 的现代方法,我会有兴趣学习它。
【问题讨论】:
-
如果
func_name是运行时字符串,那么除了使用一些哈希图之外别无选择,例如std::unordered_map. -
你能用
std::function吗?而不是传递std::string您的函数将采用std::function并且用户会指定调用什么?我认为add和subtract不能成为private,这可能会破坏目的。 -
您应该阅读一下有关范围如何工作的信息,并且可能总是使用大括号。两者都会向您表明,您希望做的事情不可能按照您编写的方式进行。您当然可以拥有分配的函数指针或名称映射 -> 函数,但不清楚为什么需要它。你写的例子很简单,没有不必要的间接性。
-
无关:你真的需要一个变量吗?
return func_name == std::string("Add") ? add(a, b) : subtract(a, b); -
@Retired Ninja:你说得对,这个简单的问题可以用更简单的方式解决;但是,这不是我正在研究的真正问题,而是一个更简单的示例,突出了我正在尝试解决的同一问题。