2014-02-10 60 views
1

我想獲得一個可以是整數或字符串的輸入,並希望將它傳遞給重載函數,以便可以自動檢測並輸出生成的候選函數。有沒有辦法做到這一點?我可以在沒有聲明變量類型的情況下獲得輸入,或者可以在C++中爲同一變量聲明多個類型?

+0

您可以使用模板。 – gartenriese

+0

@gartenriese模板在這裏沒有幫助。他想要根據用戶是否輸入數字來遵循不同的代碼路徑。 – TypeIA

+2

您嘗試過並且失敗的代碼示例,以及有關您希望發生的註釋的相關示例會很有幫助。如你所寫,你要求編譯時按候選值進行選擇,而不是按類型扣除(或如此出現)。對此,我會回答不。如果這不是您想要做什麼的準確描述,則需要發佈更多信息。 – WhozCraig

回答

3

沒有辦法做到自動,但你當然可以通過編程來完成。

  • 讀入一個字符串。
  • 檢查字符串是否是有效的數字。
  • 如果它是一個數字,請獲取它的值(通過atoi()或類似的)並將其傳遞給函數的整數版本。
  • 否則,將字符串傳遞給函數的字符串版本。

由於編譯器在編譯時無法知道輸入是否爲數字,因此無法獲得「免費」。

+0

你能否建議我一個好方法來檢查字符串,如果它是一個有效的數字。我對C++很陌生(整體也編程) – jason

+0

他已經做了 - 點擊他的帖子中的鏈接。 –

0

您可以使用Boost's lexical_cast,或者不那麼複雜(這取決於你的需要),性病::與strtol()或字符串流:

#include <cstdlib> 
#include <iostream> 
#include <sstream> 

void Process(const long   num) { std::cout << "int: " << num << "\n"; } 
void Process(const std::string& str) { std::cout << "str: " << str << "\n"; } 

int main() 
{ 
    std::string s; 
    while(std::cin >> s) 
    { 
     char* end; 
     const auto i = std::strtol(s.c_str(), &end, 10); 
     if(end == s.c_str() + s.length()) 
      Process(i); 
     else 
      Process(s); 

     std::istringstream iss(s); 
     int j; 
     if(iss >> j) 
      Process(j); 
     else 
      Process(s); 
    } 
} 

隨着輸入 「ABC 123」,我得到的輸出:

str: abc 
str: abc 
int: 123 
int: 123 
+0

謝謝你,這真的很有幫助。 – jason

相關問題