所以我遇到了一个问题,我有一个带有多个参数的函数。出于可用性,我开始重载它,以便在实例中我可以传递std::string
而不是std::fstream
实例。在此重载中,将从该字符串构造新的std::fsteam
,然后将调用另一个函数。像这样:
void func(const std::string & filename) {
std::fstream file(filename);
func(file)
}
void func(std::fstream & file) {
// ...
}
一切正常。但是当你开始为多个参数或两个以上的可能类型开始这样做时,一切都开始变得一团糟,你可能不得不用重复的代码等写出大量的重载。 所以我想知道是否有一个更优雅的解决方案来解决这个问题所需的参数。
我知道这个问题并不是特定于C ++,但我对C ++中的问题解决方案感兴趣。
答案 0 :(得分:2)
一种可能的解决方案是使用辅助类:
class param1 {
public:
param1(const std::string & filename)
: filename(filename), file(nullptr)
{
}
param1(std::fstream &file) : file(&file)
{
}
std::string filename;
std::fstream *file;
};
class param2 {
public:
param2(int flag);
param2(some_particular_class &classptr);
// etc...
};
void func(const param1 &p1, const param2 &p2);
每个参数的帮助器类包含可以传入的每种可能类型的重载构造函数。最终只需要一个func()
来实现。
在每个帮助程序类中,您需要弄清楚如何正确存储每个参数,这将是一个不同的问题。
使用C ++ 14,您也可以在这里使用std::variant
。
答案 1 :(得分:1)
所以我发现了一个相当不错且可扩展的解决方案:
假设我们有一个函数可以接受type_right1
,type_right2
和type_right3
类型的3个参数,但我们也希望为它提供额外的重载。相应类型type_right1
,type_wrong2
和type_wrong3
。我们也假设从type_wrongX
到type_rightX
我们只调用后者的构造函数并传递前者。代码如下所示:
template<class T1, class T2>
void func(type_wrong1 arg1, T1 arg2, T2 arg3) {
func(type_right1(arg1), arg2, arg3);
}
template<class T1>
void func(type_right1 arg1, type_wrong2 arg2, T1 arg3) {
func(arg1, type_right2(arg2), arg3);
}
void func(type_right1 arg1, type_right2 arg2, type_wrong3 arg3) {
func(arg1, arg2, type_right2(arg3));
}
void func(type_right1 arg1, type_right2 arg2, type_right3 arg3) {
// actual function
}
这个解决方案可以通过更多参数和每个参数两种以上类型轻松扩展,并且需要更少的写入,并且只生成您实际需要的功能!
谢谢你的帮助。