c++ - 有没有比这更有效的结构/模式 C++ 方法?

标签 c++

基本思想是我有一个类“家族”,它们都做相同的事情,但方式略有不同。这个“系列”用于“高性能”循环,因此速度至关重要。此外,具体的系列由配置文件指定...

问题是这里的主函数中有大量的代码重复。有没有更好的方法来构建它,所以我不必写 HP<objx> testtest.loop(bobloblaw)三次? (实际上,这段代码比 2 行多很多...)

class obj1 {
public:
    double f(double x) const { return 1.; }
};

class obj2 {
public:
    double f(double x) const { return x; }
};

class obj3 {
public:
    double f(double x) const { return x*x; }
};

template <class O>
class HP {
private:
    O obj;

public:

    double loop(const vector<double>& x) {
        double s = 0.;
        for (auto i : x) s += obj.f(i);

    return s;
    }
};

int main() {
    string config = "bob";
    double result = 0;
    vector<double> bobloblaw;

    /* Read configuration file to determine which object to use. */
    if (config == "obj1") {
        HP<obj1> test;
        result = test.loop(bobloblaw);
    } else if (config == "obj2") {
        HP<obj2> test;
        result = test.loop(bobloblaw);
    } else if (config == "obj3") {
        HP<obj3> test;
        result = test.loop(bobloblaw);
    }

    return result;
}

最佳答案

以下未经测试,但应该有效:

class obj1
{
public:
  double f(double x) const { return 1.; }
};

class obj2
{
public:
  double f(double x) const { return x; }
};

class obj3
{
public:
  double f(double x) const { return x*x; }
};

class HPbase
{
public:
  virtual double loop(const vector<double>&) = 0;
};

template <class O> class HP:
  public HPbase
{
public:
  double loop(const vector<double>& x)
  {
    double s = 0.;
    for (auto i : x)
      s += obj.f(i);
    return s;
  }
private:
  O obj;
};

std::unordered_map<std::string, std::unique_ptr<HPbase>> decode{
  {"obj1"}, new HP<obj1>()},
  {"obj2"}, new HP<obj2>()},
  {"obj3"}, new HP<obj3>()} };

int main()
{
  string config = "bob";
  double result = 0;
  vector<double> bobloblaw;

  /* Read configuration file to determine which object to use. */
  result = decode[config].loop(bobloblaw);
}

请注意,唯一添加的是 HP<> 的基类和一张 map ,它取代了 if/else代码的逻辑。

关于c++ - 有没有比这更有效的结构/模式 C++ 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8859729/

相关文章:

c# - 为什么在 c#/c++ dll 互操作期间出现 System.AccessViolationException?

c++ - 大 double 除以大 int

c++ - 整数转换问题

c++ - Linux 系统调用 aio_write() 失败,错误代码为 22 (EINVAL)

javascript - 如何设计一个支持javascript插件的C++插件框架

c++ - 模板友元

c++ - 为什么 mt19937 m(random_device()()) 无法编译?

c++ - 为什么使用 void(unused) (和类似的)而不是无名参数来消除 C++ 函数中的未使用变量警告?

c++ - 这些宏和 typedef 有什么作用?如何将其扩展为成员函数?

c++ - foo(int& x); x 是通过引用传递的吗?