如何推断元函数的类型及其模板参数?

时间:2014-09-22 04:50:59

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

假设我有一个元函数,它需要类型的参数。如何在不强制函数用户单独提供类型及其参数的情况下执行此操作?

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;

我该怎么做?

1 个答案:

答案 0 :(得分:4)

你可以&#34;反汇编&#34;通过使用部分特殊化(某种形式的模式匹配)对模板本身和模板参数进行类模板特化。

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

template <typename T>
struct MetaFunction;

然后,我们定义此类模板MetaFunction部分特化。部分特化是类模板的特例。如果适用,则使用部分特化而不是原始(主)模板来创建类。模板&#34;接口&#34;,即您可以/必须提供的用于实例化MetaFunction模板的模板参数的数量和种类不会因特化的存在而改变。

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

template <template<typename...> class TT, typename ... Args>
struct MetaFunction /* not finished yet */

有三种模板参数:

  • 输入参数
  • &#34;值&#34;参数(非类型)
  • 模板参数

此部分专精化使用模板模板参数。此类参数的有效参数必须是类模板或别名模板。

我们通过提供&#34;模式&#34;来指定何时使用这种部分专业化:

template <template<typename...> class TT, typename ... Args>
struct MetaFunction<TT<Args...>>
{
  using type = SomeOperation<TT, Args...>;
};

如果提供给MetaFunction模板的类型与模式TT<Args...>匹配,则会使用此部分特化,即,如果它可以被反汇编为类 / alias < sup>(*)模板TT和一些模板类型参数Args

(*)正确地注意到T.C.,通过 alias-template 生成的类型与alias-template无关。因此,您无法从类型中推断出别名模板。