从模板类型包中推断参数包类型
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"),如果出于某种原因完全 auto
matic 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]...);
}
是否可以传递模板类型的参数包,并从模板类型存储的类型中推断出参数包。
例如我有一个函数 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"),如果出于某种原因完全 auto
matic 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]...);
}