我有一个静态助手类,它有几个使用相同参数的函数:
class helper {
public:
static double getValue(const CString &a, const CString &b, const CString &c, ... );
private:
static double foo(const CString &a, const CString &b, const CString &c, ... );
static bool bar(const CString &a, const CString &b, const CString &c, ... );
static bool qux(const CString &a, const CString &b, const CString &c, ... );
static double wad(const CString &a, const CString &b, const CString &c, ... );
static int xyz(const CString &a, const CString &b, const CString &c, ... );
};
使用它像:
double value = helper::getValue(a, b, c, k, ...);
getValue()
会致电foo()
,致电bar()
,qux()
和wad()
等。
它们都需要相同的a,b,c数据集。
正如您所看到的,有许多重复的参数看起来有点混乱。
有没有办法重构它?
答案 0 :(得分:2)
是的,创建一个包含所有参数作为成员的类/结构Params
。让静态函数接受Params
的实例而不是所有参数。您的代码如下所示:
struct Params {
const CString &a;
const CString &b;
const CString &c;
...
}
class helper {
public:
static double getValue(const Params & p);
private:
static double foo(const Params & p);
static bool bar(const Params & p);
static bool qux(const Params & p);
static double wad(const Params & p);
static int xyz(const Params & p);
};
这样,您只需创建一次Params
对象并传递它。
答案 1 :(得分:0)
一个可能的解决方案可能是让getValue
返回一个内部类实例,该实例可以转换为double
。
这样的事情:
class helper
{
public:
class helper_internal_class
{
friend class helper;
public:
operator double() const
{
return foo();
}
private:
helper_internal_class(const CString &a, const CString &b, const CString &c, ...)
: a_(a), b_(b), c_(c), ...
{}
CString a_;
CString b_;
CString c_;
...
double foo() const;
{
// Do something more...
return bar();
}
double bar() const;
...
};
static helper_internal_class getValue(const CString &a, const CString &b, const CString &c, ...)
{
return helper_internal_class(a, b, c, ...);
}
};
它是一个更多的样板,但至少你不必一直传递这些论据。
如果更好?这取决于你。 :)
答案 2 :(得分:0)
如果要对带有可变参数列表的函数执行此操作,则无法直接执行此操作。您不能将变量参数列表传递给具有变量参数列表的另一个函数。
相反,您可以使用类型为va_list的参数声明一个函数,在带有变量参数列表的函数中使用va_start和va_end来创建一个va_list,并将其传递给辅助函数。