如何推导元函数的类型及其模板参数
How can I deduce the type and its template arguments for a meta-function?
假设我有一个元函数,它需要类型及其参数。如何在不强制函数的用户分别提供类型及其参数的情况下做到这一点?
using MyType = SomeType<T1, T2, T3>; // This is the type to pass to the functor
template <typename MyType, typename ... Args>
struct MetaFunction
{
using type = SomeOperation<MyType, Args...>;
}
// I want to be able to call my functor like this:
MetaFunction<MyType>::type;
// but with the above I have to call it like this:
MetaFunction<MyType, T1, T2, T3>::type;
我该怎么做?
您可以使用部分规范(某种形式的模式匹配)将类模板专用化"反汇编"为模板本身和模板参数。
首先,我们将MetaFunction
定义为一个(类)模板,它将类型作为其唯一参数:
template <typename T>
struct MetaFunction;
然后,我们定义了这个类模板MetaFunction
的部分专门化。部分专门化是类模板的一种特殊情况。如果情况适用,则使用部分专用化而不是原始(主)模板来生成类。模板"接口",即您可以/必须提供的实例化MetaFunction
模板的模板参数的数量和类型,不会因专业化的存在而改变。
与显式专门化相反,部分专门化也是一个模板,这意味着它具有模板参数。分部意味着它没有完全指定作为特殊情况应用于哪些类型(模板参数集)。通常,部分专业化应用于可以提供给主模板的可能/有效参数集的子集。
template <template<typename...> class TT, typename ... Args>
struct MetaFunction /* not finished yet */
模板参数有三种:
- 类型参数
- "值"参数(非类型)
- 模板参数
此部分专用化使用模板模板参数。此类参数的有效参数必须是类模板或别名模板。
我们通过提供"模式"来指定何时使用这种部分专业化:
template <template<typename...> class TT, typename ... Args>
struct MetaFunction<TT<Args...>>
{
using type = SomeOperation<TT, Args...>;
};
如果提供给MetaFunction
模板的类型与模式TT<Args...>
匹配,即,如果它可以分解为类/alias(*)模板TT
和一些模板类型参数Args
,则将使用此部分专用化。
(*)正如T.C.正确指出的,通过别名模板生成的类型与别名模板无关。因此,您无法从类型推导出别名模板。
相关文章:
- 扩展C++生成的代码的模板参数类型名称
- 如何在 c++ 中定义接受不同参数类型的函数向量?
- 在 C++ 中运行时调用模板时,是否可以切换模板的参数类型?
- 将函数参数类型声明为 auto
- 将函数的参数 - 签名从使用 'std::function<T>' 转换为模板参数类型
- 在 C++17 中调用具有不同参数类型的构造函数
- 具有先前参数类型匹配的参数包
- 我想知道为什么"std::unique_ptr<int> foo(新 int)"是合法的,因为"std::<int>unique_ptr"要求输入参数类型应该是"int"?
- 将可变参数类型列表的扩展打包为复杂类型的初始值设定项列表 - 合法吗?
- MSVC 错误:4 个重载中的任何一个都无法转换所有参数类型
- 使用constexpr + auto作为返回和参数类型的奇怪类型推导
- 如何从第一个参数推断第二个参数类型?
- C++模板函数中,指定回调函子/lambda 的参数类型,同时仍允许内联?
- 如何用不同的参数类型和数字回调函数
- C++stoi:这两个重载都无法转换所有参数类型
- 为什么std::{container}::template不能推导其参数类型
- 为模板参数类型中的新对象分配内存
- 为指向成员模板参数的指针推导额外模板参数类型的紧凑方式
- 使用std::conditional中的模板来确定函数参数类型
- C++中的短参数类型