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)...};