C++:如何在可变参数模板参数上调用带有类型参数的函数?

问题描述

所以我有一个带有可变参数模板参数的函数,我正在尝试为每个参数调用一个方法(带有类型参数),将每个结果值打包到 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)...};