从模板类型包中推断参数包类型

Infer parameter pack types from pack of template types

是否可以传递模板类型的参数包,并从模板类型存储的类型中推断出参数包。

例如我有一个函数 foo,它 returns 一个包含参数 A... 的元组。如果该函数接受一个向量参数包 B...,它存储要在 A... 中找到的类型,是否可以仅从 A... 中以某种方式推断出这些类型?或者必须始终明确指定它们?

template <typename A..., typename B...>
std::tuple<B...> foo(A...)
{
    ...
}

std::vector<int> a;
std::vector<char> b;
std::vector<std::string> c;
auto bar = foo<int, char, std::string>(a, b, c); // Works
auto bar = foo(a, b, c); // Will not work because B... can't be inferred yet.

此外,我可以通过 static_assert 实现 A... 中的所有类型必须是 std::vector 的约束,但我可以想象有一种使用模板类型的更简洁的方法。如果存在这样的方法,请您也推荐一下吗?

谢谢。

考虑到提供的示例和澄清注释 ("function should return a tuple of a first elements to each vector"),如果出于某种原因完全 automatic return,尾随的 return 类型将完成这项工作不需要类型推导:

#include <tuple>
#include <vector>

template<class... ARG> auto foo(ARG... ) -> std::tuple<typename ARG::value_type...>;

auto bar() {
    std::vector<int> a;
    std::vector<bool> b;
    std::vector<char* > c;
    return foo(a, b, c);
}

如果您希望推断类型而不是使用自动 return 类型

template <typename ... Ts>
std::tuple<Ts...> foo(const std::vector<Ts>& ... Vec)
{
    return std::make_tuple(Vec[0]...);
}