C++ 函数对象参数

标签 c++ object arguments

如何让函数接受任意数量的参数然后相应地检查其数据类型? 我知道在 java 中它的 Objects..arguments 然后执行 instanceof 来检查数据类型,但在 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();
}

最佳答案

虽然您可以使用可变参数模板或类似的东西,但我建议只使用变体库,例如 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 来允许任意数量的参数。

关于C++ 函数对象参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42974682/

相关文章:

python - 为什么这个 python 表达式参数在调用时没有扩展?

python - 为什么/为什么有些类需要所有可能的参数,而有些则不需要?

c++ - 这两种包含相同 header 的方式在编译器中是否发生了不同的事情?

c++ - 代码工作到一定程度然后崩溃

javascript - 动态创建二维对象Javascript

javascript - 将属性添加到对象数组

c++ - 打开文件并使用 fseek 获取文件大小 - C++

C++外部程序IO

php - 如何从时间戳对象和日期时间对象数组中提取值

c++ - 为什么数组参数被视为 const 数组?