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

时间:2018-07-11 19:42:49

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

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

例如我有一个函数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...来实现std::vector内的所有类型必须为static_assert的约束,但我可以想象使用模板类型的方法更整洁。如果存在,请您也可以建议这样一种方法吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

考虑到提供的示例并弄清楚注释(“函数应向每个向量返回第一个元素的元组”),如果出于某种原因完全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);
}

答案 1 :(得分:1)

如果您想推断类型而不是使用自动返回类型推断

*SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/apache-hive-2.3.3-bin/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/hadoop-3.0.3/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Logging initialized using configuration in jar:file:/opt/apache-hive-2.3.3-bin/lib/hive-common-2.3.3.jar!/hive-log4j2.properties Async: true
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.*