使用相同的参数重构静态成员函数

时间:2015-05-05 23:36:04

标签: c++ class static-methods

我有一个静态助手类,它有几个使用相同参数的函数:

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数据集。

正如您所看到的,有许多重复的参数看起来有点混乱。

有没有办法重构它?

3 个答案:

答案 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,并将其传递给辅助函数。