【发布时间】:2022-01-07 08:12:58
【问题描述】:
我正在尝试定义一个命名空间/结构,其中包含存储特定实现的函数指针(假设一个包含多个函数的结构)。目前,使用以下结构一切正常:
class foo{
int a;
int b;
public:
explicit foo(int _a, int _b) : a(_a), b(_b) {};
std::function<int(int)> bar(int num) = [=](int num) -> int{
// here I need to know a and b
//do something with num and return
}
}
这个类包含几个函数,每个函数都必须知道 a 和 b。问题是我必须创建类的实例并设置参数 a 和 b,我宁愿省略。 在另一个类中,我只通过使用它的功能来使用这个类。即
class foo2{
//some other parameters
int a, b;
std::function<...> fun1, fun2,...;
public:
foo2(int a, int b, ....){this->a = a; this->b = b;};
setFuncs(){
foo instance(a, b);
this->fun1 = [instance](int num){ return instance.bar(num);}
this->fun2 = ...
}
}
但我想省略每次都创建一个新的类实例(从某种意义上说,我在同一个类中重复上述行为,但在代码中的另一个位置)。我试图将这个类模板化为
template<int a, int b>
class foo{
...
}
所以我可以将函数分配为:
this->fun1 = foo<a,b>::bar;
但是我需要在编译时知道 a 和 b,这是不可能的。这些参数在类 foo2 中设置一次。我意识到整体代码可能并不干净,正如您所见,我是物理学家,而不是 IT 人。一种方法是将类 foo 的实例存储在类 foo2 中,并为整个类初始化一次,并让函数 fun1、fun2、... 通过引用这些指针来访问,但我正在寻找是否有另一个方式(可能是类之类的模板,我不需要在编译时知道这些值)。 此外,我无法在此处粘贴整个代码,因为它在多个文件中包含数千行,并且很难描述代码的作用。如果这可能是一个愚蠢或微不足道的问题,我感谢任何帮助并道歉(我不严格地从事 IT 工作,我是一名物理学家;))
【问题讨论】:
-
我认为您可能遇到了 XY 问题。我觉得你想要某种预制的函数参数化,但我没有清楚地理解你的意图。您需要提供某些功能但具有比单个函数调用更大范围的预定义输入的对象。您可能会错过某个设计模式,或者可能只是使 (XY) 问题过于复杂。
-
“问题是我必须创建类的实例并设置参数 a 和 b,我宁愿省略” - 如果您希望任何状态保持比 a 更长的时间,这是不可避免的单个函数调用。您希望某些东西保留/应用更长时间,因此(除非它是编译时数据)状态是不可避免的。所有解决方案都只是封装数据的方式不同——结构成员、捕获 lambda、
std::function和状态。
标签: c++ function class templates namespaces