【问题标题】:Infer parameter pack types from pack of template types从模板类型包推断参数包类型
【发布时间】:2018-07-11 19:42:49
【问题描述】:

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

例如我有一个函数 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.

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

谢谢。

【问题讨论】:

  • 有什么理由反对返回类型扣除?为什么不像auto foo(A... as) { return std::make_tuple(as...); }
  • 如果在实际构造元组之前需要知道类型。虽然我在这个例子中意识到情况并非如此。
  • 此代码无法编译。您的示例中预期的元组是什么?
  • 一个元组,包含传递给 foo 的每个向量的第一个元素。

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


【解决方案1】:

如果您希望推断类型不使用自动返回类型进行推断

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

【讨论】:

  • 谢谢,没想到包可以这样展开。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-12
    • 2023-03-31
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 2018-07-07
    • 1970-01-01
    相关资源
    最近更新 更多