gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:31:15 28 4
gpt4 key购买 nike

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

问题是这里的主函数中有大量的代码重复。有没有更好的方法来构建它,所以我不必写 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com