是否可以传递模板类型的参数包,并从模板类型存储的类型推断参数包。
例如我有一个函数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
的约束,但我可以想象使用模板类型的方法更整洁。如果存在,请您也可以建议这样一种方法吗?
谢谢。
答案 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.*