将可变参数模板链接在一起

发布于 2024-12-25 13:18:23 字数 869 浏览 2 评论 0原文

如果将以下代码中的 X 转换为使用 C++11 可变参数模板,并且应该支持任意数量的模板参数,那么它会是什么样子?

template<int OFFSET>
struct A { enum O { offset = OFFSET }; enum S { size = 2 }; };

template<int OFFSET>
struct B { enum O { offset = OFFSET }; enum S { size = 4 }; };

template<int OFFSET>
struct C { enum O { offset = OFFSET }; enum S { size = 10 }; };

template < template <int> class B0,
           template <int> class B1,
           template <int> class B2  >
struct X : public B0<1>,
                  B1<B0<1>::size * B0<1>::offset >,
                  B2< B1<B0<1>::size * B0<1>::offset >::size *
                      B1<B0<1>::size * B0<1>::offset >::offset >
{ };

int main(int argc, const char *argv[])
{
    X<A, B, C> x;
    return 0;
}

What would X in the following code look like if it was converted to use C++11 variadic templates, and should support arbitrary number of template arguments?

template<int OFFSET>
struct A { enum O { offset = OFFSET }; enum S { size = 2 }; };

template<int OFFSET>
struct B { enum O { offset = OFFSET }; enum S { size = 4 }; };

template<int OFFSET>
struct C { enum O { offset = OFFSET }; enum S { size = 10 }; };

template < template <int> class B0,
           template <int> class B1,
           template <int> class B2  >
struct X : public B0<1>,
                  B1<B0<1>::size * B0<1>::offset >,
                  B2< B1<B0<1>::size * B0<1>::offset >::size *
                      B1<B0<1>::size * B0<1>::offset >::offset >
{ };

int main(int argc, const char *argv[])
{
    X<A, B, C> x;
    return 0;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

晒暮凉 2025-01-01 13:18:23

也许:

template <int Var, template <int> Head, typename... Tail>
struct X_helper : Head<Var>,
                , X_helper<Head<Var>::size * Head<Var>::offset, Tail...>
{};

template <int Var, template <int> Arg>
struct X_helper : Head<Var>
{};

template <typename... Args>
struct X : X_helper<1, Args...>
{};

我希望我的语义是正确的。

Maybe:

template <int Var, template <int> Head, typename... Tail>
struct X_helper : Head<Var>,
                , X_helper<Head<Var>::size * Head<Var>::offset, Tail...>
{};

template <int Var, template <int> Arg>
struct X_helper : Head<Var>
{};

template <typename... Args>
struct X : X_helper<1, Args...>
{};

I hope I got the semantics right.

玩套路吗 2025-01-01 13:18:23

你对这个问题还感兴趣吗?

我正在使用 C++11,所以我尝试回答。

我不确定你想要什么(嗯……你在 2012 年想要什么),但我认为下面的例子应该能满足你的需求。

template<int OFFSET>
struct A { enum O { offset = OFFSET }; enum S { size = 2 }; };

template<int OFFSET>
struct B { enum O { offset = OFFSET }; enum S { size = 4 }; };

template<int OFFSET>
struct C { enum O { offset = OFFSET }; enum S { size = 10 }; };

template <int N, template <int> class ...>
   struct H;

template <int N>
   struct H<N>
    { };

template <int N,
          template <int> class C1,
          template <int> class ... Cs>
   struct H<N, C1, Cs...> : public C1<N>,
                            public H<C1<N>::size * C1<N>::offset, Cs...>
    { };

template <template <int> class ... C>
   struct X : public H<1, C...>
    { };

int main()
 {
   X<A, B, C> x;

   return 0;
 }

ps:抱歉我的英语不好

You're still interested in this question?

I'm plying with C++11 so I've tried to answer.

I'm not sure to understand what you want (well... what you wanted in 2012) but I think the following example should catch you're requirements.

template<int OFFSET>
struct A { enum O { offset = OFFSET }; enum S { size = 2 }; };

template<int OFFSET>
struct B { enum O { offset = OFFSET }; enum S { size = 4 }; };

template<int OFFSET>
struct C { enum O { offset = OFFSET }; enum S { size = 10 }; };

template <int N, template <int> class ...>
   struct H;

template <int N>
   struct H<N>
    { };

template <int N,
          template <int> class C1,
          template <int> class ... Cs>
   struct H<N, C1, Cs...> : public C1<N>,
                            public H<C1<N>::size * C1<N>::offset, Cs...>
    { };

template <template <int> class ... C>
   struct X : public H<1, C...>
    { };

int main()
 {
   X<A, B, C> x;

   return 0;
 }

p.s.: sorry for my bad English

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文