如何在函数模板中声明模板特化?

时间:2014-04-01 15:45:23

标签: c++ templates template-specialization

假设我有一个类模板

template<int I, int J> class bar { /* ... */ };

并希望使用以下模板模板

template<template<int> class C>
struct foo { void func(some_type arg); };

C等于bar,第二个模板参数绑定(固定)。实现这一目标的一种方法是

template<int J, template<int, int> class B>
struct use_foo_helper {
  template<int I> using BJ = B<I,J>;
  static void func(some_type arg) { foo<BJ>::func(arg); }
};
template<int J>
void foo_bar(some_type arg) { use_foo_helper<J,bar>::func(arg); }

但是,仅为此目的创建辅助类(use_foo_helper)非常不方便。我宁愿只定义函数模板foo_bar,但失败了:

template<int J>
void foo_bar(some_type arg)
{
  // template<int I> using barJ = bar<I,J>;  // this appears to be illegal
  // for<barJ>::func(arg);
  foo< ??? >::func(arg);                     // what shall I put in place of ???
};

有没有办法避免帮助类? 是否有更好的设计模式可以实现相同目标?

1 个答案:

答案 0 :(得分:1)

您可以通过以下方式执行此操作:

template <int I, int J>
class bar{};

template <template<int> class C>
struct foo
{
    static
    void func(some_type arg){}
};

template <int J>
class foo_bar
{
    template <int I>
    using barJ = bar<I, J>;

public:

    static
    void call(some_type arg)
    {
        foo<barJ>::func(arg);
    }
};

使用示例:foo_bar</*...*/>::call(/*...*/);

但是如果你只想修改类模板的一个参数,可以更简单地完成:

template <int J>
struct barJ
{
    template <int I>
    using type = bar<I, J>;
};

使用示例:foo<barJ</*...*/>::type>::func(/*...*/);