2017-03-23 136 views
0

我如何有一個函數可以接受任意數量的參數,然後相應地檢查其數據類型? 我明白,在Java它的對象..然後做instanceof來檢查數據類型,但在C + +?C++函數對象參數

基本類似轉換到這個C++

public int Testing(String sql, Object...arguments) throws SQLException{ 

    PreparedStatement ps = con.prepareStatement(sql); 
    for(int i=0; i< arguments.length; i++){ 
     if (arguments[i] instanceof String) 
      ps.setString(i+1, arguments[i].toString()); 
     else if (arguments[i] instanceof Integer) 
      ps.setInt(i+1, Integer.parseInt(arguments[i].toString())); 
    } 
    return ps.executeUpdate(); 
} 
+0

[C++等效的instanceof]的可能的重複(http://stackoverflow.com/questions/500493/c-equivalent-of-instanceof) –

+0

我不太清楚你到底想要什麼,特別是因爲Java的'instanceof ''不* *會帶來可變數量的參數,因此類比就會失效。 –

+0

@Konrad Rudolph像我會實際使用for循環來檢查每個參數的數據類型 – Tyra

回答

1

雖然你可以使用可變參數模板或類似的東西,我只是用一個變體文庫如boost::variant,保持它的簡單建議:

#include <boost/any.hpp> 
#include <iostream> 
#include <string> 

int Testing(std::initializer_list<boost::any> args) { 
     for(const auto &arg : args) { 
       std::cout << "Arg type: " << arg.type().name(); 
       if(arg.type() == typeid(int)) { // Check for int 
         int value = boost::any_cast<int>(arg); 
         std::cout << " | Int value: " << value << std::endl; 
       } else if(arg.type() == typeid(std::string)) { 
         std::string value = boost::any_cast<std::string>(arg); 
         std::cout << " | String value: " << value << std::endl; 
       } 
       // ... same for other types such as float 
     } 
     return 0; 
} 

int main() { 
     Testing({1, 2}); 
     Testing({std::string("abc"), 1}); 
     return 0; 
} 

如您所見,您可以使用typeid來檢查參數的類型,並使用std::initializer_list來允許任意數量的參數。

+0

謝謝!對不起再次發生麻煩,但我如何將它設置在準備狀態? – Tyra

+0

這取決於你在C++中使用什麼庫來連接到你的SQL服務器。有許多可用的,如_soci_,_Qt_或默認的mysql-C++ - conector。如果你能問一個新問題並提供這些信息,那將是最好的。 –

+0

我正在使用C++連接器。我非常感謝! – Tyra