简单来说,让我们考虑两个阶段。
我定义了可变结构variadic1
,variadic2
,...和模板模板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>::type
是variadic1<double,float>
,这很好。
我定义了模板类型别名variadic1_char
,variadic2_char
,variadic1_int
,variadic2_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 >
等
我的问题是,是否可以减少第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
等。
谢谢你的回答。
答案 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;
}