【问题标题】:How can I deduce the type and its template arguments for a meta-function?如何推断元函数的类型及其模板参数?
【发布时间】:2023-04-06 18:38:01
【问题描述】:

假设我有一个元函数,它需要类型 它的参数。如何在不强制函数用户分别提供类型及其参数的情况下做到这一点?

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;

我该怎么做?

【问题讨论】:

标签: c++ templates c++11 template-meta-programming


【解决方案1】:

您可以使用部分特殊化(某种形式的模式匹配)将类模板特化“分解”成模板本身和模板参数。

首先,我们将MetaFunction 定义为一个(类)模板,它以type 作为其唯一参数:

template <typename T>
struct MetaFunction;

然后,我们定义这个类模板MetaFunction 的一个部分特化。部分特化是类模板的一种特殊情况。如果情况适用,则使用部分特化代替原始(主要)模板来创建类。模板“接口”,即您可以/必须提供以实例化 MetaFunction 模板的模板参数的数量和种类不会因特化的存在而改变。

显式特化相反,部分特化也是一个模板,这意味着它具有模板参数。 partial 意味着它没有指定 full 作为特殊情况应用的类型(模板参数集)。通常,部分特化适用于您可以提供给主模板的一组可能/有效参数的子集。

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&lt;Args...&gt; 匹配,则将使用此部分特化,即,如果它可以反汇编成一个类/alias(* ) 模板TT 和一些模板type 参数Args

(*) 正如T.C. 正确指出的那样,通过alias-template 生成的类型与别名模板无关。因此,您不能从类型中推断出别名模板。

【讨论】:

  • 由于偏特化匹配使用模板参数推导,IIRC不会使用别名模板。
  • @T.C.啊,对。不知何故,我没有看到评论通知,或者它没有正确传递:(
猜你喜欢
  • 2019-09-12
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 2023-03-31
  • 2015-02-06
  • 2018-03-29
相关资源
最近更新 更多