gpt4 book ai didi

c++ - 模板元编程的可变参数模板

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:42:48 25 4
gpt4 key购买 nike

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

  1. 我定义可变参数结构 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>::typevariadic1<double,float> ,这很好。

  2. 我定义模板类型别名 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 个模板-模板-模板-s,即 magicVariadic1 对其进行概括, magicVariadic2能够写出类似 applyTo_double_float<magicVariadic1<char>>::type 的东西而不是 applyTo_double_float<variadic1_char>::type .

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

最佳答案

这似乎对我有用:

#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;
}

关于c++ - 模板元编程的可变参数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26027092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com