是否可以编写一个c++模板函数,该函数接受可变数量的不同类型的输入变量(输入数量可以限制为10个)?
例如采用函数sql_exec(),该函数执行sql查询字符串并将结果行保存在提供的类型的std vector 中,即

std::vector<double> x,y;
std::vector<std::string> s;
std::string query="select * from ...";

sql_exec(query, s,x,y); // error if less than 3 rows or conversion not possible

现在我的幼稚方法应该是(仅限于最多2个 vector )
struct null_type {};
template <typename T1=null_type, typename T2=null_type>
void sql_query(const std::string& query_str, std::vector<T1>& col1,
           std::vector<T2>& col2) {
    ...
}

当然这很愚蠢,因为我没有告诉函数默认参数,我们得到了
error: default template arguments may not be used in function templates

但实际上它可以使用gcc和-std=c++0x进行编译。但是,显然sql_query()仍不接受可变长度输入,需要使用2个 vector 进行调用。另外,我希望在当前的大多数编译器上都具有可移植的功能。有什么明显的我忽略了吗?我知道我可以更改设计,也可以使用boost::tuple或其他方式,但我希望使用这样一个简单的界面。

最佳答案

在C++ 0x中,这是通过可变参数模板实现的(参数的数量可能会很大,具体取决于实现方式)。

在C++ 03中,这是通过使预处理器宏生成许多具有各种含义的模板函数来模拟的(请参见Boost.Preprocessor)。

我已经使用C++ 03技术从1到10个参数生成“绑定(bind)”,并且效果很好。

关于c++ - 具有可变参数的c++模板函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6522785/

10-11 23:09
查看更多