模板元编程的可变模板

时间:2014-09-24 21:48:03

标签: c++ templates variadic-templates

简单来说,让我们考虑两个阶段。

  1. 我定义了可变结构variadic1variadic2,...和模板模板applyTo_double_float 像这样

    template<class...T> 
    struct variadic1;
    
    template<class...T>
    struct variadic2;
    
    template<template<typename...> class Templ>
    struct applyTo_double_float
    {
        typedef Templ<double, float> type;
    };
    

    有了这个,结果如下: applyTo_double_float<variadic1>::typevariadic1<double,float>,这很好。

  2. 我定义了模板类型别名variadic1_charvariadic2_charvariadic1_intvariadic2_int

    template<class...T>
    using variadic1_char = variadic1 < char, T... > ;
    template<class...T>
    using variadic2_char = variadic2 < char, T... > ;
    
    template<class...T>
    using variadic1_int = variadic1 < int, T... > ;
    template<class...T>
    using variadic2_int = variadic2 < int, T... > ;
    

    现在我可以写applyTo_double_float<variadic1_char>::type给我variadic1 < char, double,float >。同样 applyTo_double_float<variadic1_int>::type == variadic1 < int, double,float >

  3. 我的问题是,是否可以减少第2阶段(4个)模板数量的两倍,并在2个template-template-template-s的帮助下进行推广,即magicVariadic1,{{ 1}}能够写出类似magicVariadic2而不是applyTo_double_float<magicVariadic1<char>>::type的内容。

    或者甚至可以引入一个applyTo_double_float<variadic1_char>::type模板,该模板将替换第2阶段的所有模板,并允许编写例如superMagic而不是applyTo_double_float<superMagic<variadic1, char>>::type等。 谢谢你的回答。

1 个答案:

答案 0 :(得分:2)

这似乎对我有用:

#include <iostream>
#include <typeinfo>

template<class...T> 
struct variadic1 {};

template<template<typename...> class Templ>
struct applyTo_double_float
{
    typedef Templ<double, float> type;
};

template<class T1>
struct variadic1_magic
{
   template<class...T> struct inner
   {
      typedef variadic1<T1, T...> type;
   };
};

int main()
{
   typedef applyTo_double_float<variadic1_magic<char>::inner>::type Type1;
   std::cout << typeid(Type1).name() << std::endl;
   return 0;
}

<强>更新

更好的解决方案,感谢@dyp:

template<template<class...> class TT, class... U>
struct super_magic
{
   template<class... V>
      struct inner
      {
         using type = TT<U..., V...>;
      };
};

int main()

{
   using Type1 = applyTo_double_float< super_magic<variadic1, char>::inner >::type;
   std::cout << typeid(Type1).name() << std::endl;

   return 0;
}