首页 > 解决方案 > 从模板类型包推断参数包类型

问题描述

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

例如,我有一个函数 foo ,它返回一个包含参数的元组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.

此外,我可以通过 a 实现所有类型A...必须为std::vectors的约束,static_assert但我可以想象有一种更简洁的方式使用模板类型。如果存在这种方法,您能否也建议一种方法?

谢谢。

标签: c++templatesc++17variadic-functions

解决方案


考虑到提供的示例和澄清注释(“函数应该将第一个元素的元组返回给每个向量”),如果出于某种原因不需要完全auto返回类型推导,则尾随返回类型将完成这项工作:

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

推荐阅读