基本思想是我有一个类“家族”,它们都做相同的事情,但方式略有不同。这个“系列”用于“高性能”循环,因此速度至关重要。此外,具体的系列由配置文件指定...
问题是这里的主函数中有大量的代码重复。有没有更好的方法来构建它,所以我不必写 HP<objx> test
和 test.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/