问题描述
所以我有一个带有可变参数模板参数的函数,我正在尝试为每个参数调用一个方法(带有类型参数),将每个结果值打包到 std::tuple
中并返回它。然而,可变参数模板对我来说很难,我还没有完全理解它们。
甚至可以用 C++ 实现这一点吗?
这是我目前的代码(getMultiple
函数中有错误)。非常感谢您的帮助!
#include <iostream>
#include <fstream>
#include <sstream>
template<typename T>
T get(std::istream &stream) {
T data;
stream >> data;
return data;
}
template<typename ... Ts>
std::tuple<Ts...> getMultiple(std::istream &stream) {
// What am I doing wrong here?
return std::make_tuple((get<Ts...>(stream)));
}
int main() {
std::istringstream stream("count 2");
auto [command,number] = getMultiple<std::string,int>(stream);
return 0;
}
解决方法
首先,你忘记了
#include <tuple>
您可能正在寻找的语法是:
return std::make_tuple(get<Ts>(stream)...);
,
您几乎是正确的,但您的 ...
放错了位置,
get<Ts...>(stream)
翻译为 get<T0,T1,..,Tn>(stream)
应该是
foo(get<Ts>(stream)...)
转换为 foo(get<T0>(stream),get<T1>(stream),get<Tn>(stream))
并且您对评估顺序有疑问
在 foo(a(),b())
中,a()
和 b()
的顺序不确定,因此 a()
可能发生在 b()
之前,或者相反。可变参数模板不会改变这一点。
因此您不能使用 std::make_tuple
。幸运的是,在 {..}
中,顺序是从左到右确定的,因此您可以使用:
return std::tuple{get<Ts>(stream)...};