2017-03-23 98 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