【发布时间】:2018-07-13 19:27:32
【问题描述】:
假设我有一个模板
template<typename Bar>
Result foo(const Input& input);
而我想创建一个模板foo(),它将获得许多Bar 模板参数和许多Input,并将Result 放在一起。
我写了一个带有输入容器的版本:
template<typename Bar>
Result foo(const std::vector<Input>& inputs);
template<typename Bar1, typename Bar2, typename ... Bars>
Result foo(const std::vector<Input>& inputs) {
// calls foo<Bar2, Bars ...>(shorter_inputs);
}
但是,上面的版本无法在编译时检查输入的长度是否与模板参数的数量匹配。另外,我想要一个不需要容器的版本,只需输入即可:
foo<Bar1, Bar2>(input1, input2);
// instead of
// foo<Bar1, Bar2>({input1, input2});
我尝试写这样的东西
template<typename Bar1, typename Bar2, typename ... Bars>
Result bar(const Input& in1, const Input& in2, const Input& ... inputs)
被编译器拒绝,因为... 仅适用于参数包。不借助va_args,是否可以在C++中写出这样一个可变参数函数?
【问题讨论】:
标签: c++ c++11 templates variadic-templates template-meta-programming