C++:如何在可变模板参数上调用带有类型参数的函数?
C++: How call a function with type parameter on variadic template arguments?
所以我有一个带有可变模板参数的函数,我试图为每个参数调用一个方法(带有类型参数),将每个结果值打包在 std::tuple
和 return 中它。然而可变参数模板对我来说很难,我还没有完全理解它们。
甚至可以用 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)...};
所以我有一个带有可变模板参数的函数,我试图为每个参数调用一个方法(带有类型参数),将每个结果值打包在 std::tuple
和 return 中它。然而可变参数模板对我来说很难,我还没有完全理解它们。
甚至可以用 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)...};