簡體   English   中英

具有相同參數的多種類型的函數

[英]Function with multiple types for same parameter

所以我遇到了一個問題,我有一個帶有多個參數的函數。 出於可用性,我開始重載它,以便在實例中我可以傳遞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 ++中的問題解決方案很感興趣。

一種可能的解決方案是使用輔助類:

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

所以我找到了一個相當不錯且可擴展的解決方案:

假設我們有一個函數接受類型為type_right1type_right2type_right3 3個參數,但我們也想為它提供相應類型type_right1type_wrong2type_wrong3的附加重載。 我們也type_wrongXtype_wrongXtype_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
}

這個解決方案可以通過更多參數和每個參數兩種以上類型輕松擴展,並且需要更少的寫入,並且只生成您實際需要的功能!
謝謝您的幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM