使用表达式参数专门化模板

时间:2012-08-15 04:24:09

标签: c++ templates

我有一个这样的课程:

template <class T>
class Foo;

我想要专业化

template <>
class Foo < size_t N >;

但这并不适合我:

我的主要是:

Foo<int> p;  // OK
Foo<15> p2;  // fails to compile

我错过了什么?

3 个答案:

答案 0 :(得分:5)

你不能 - 你的模板总是带有一个类型参数。专业化只能比这更特殊,但不能不同(因此名称)。

也许您可以使用辅助模板来存储价值信息:

template <typename T, T Val> struct ValueWrapper { };

template <typename T> struct Foo;

templaet <typename T, T Val> struct Foo<ValueWrapper<T, Val>>
{
    typedef T type;
    static type const value = Val;

    // ...
};

用法:

Foo<char> x;
Foo<ValueWrapper<int, 15>> y;

答案 1 :(得分:3)

有三种模板参数:表示类型的参数(例如class Ttypename T),表示非类型的参数(例如int N或{{1} }),以及代表模板的那些(例如size_t N)。

为模板定义的参数是第一种(类型参数),但专门化采用第二种(非类型参数)。这不起作用。专业化的参数必须与主模板定义的相应参数相同。

答案 2 :(得分:2)

您可以使用中间类来专门化该类:

template <class T>
class Foo
{
public:
  static const bool is_number = false;
};
template <size_t number>
struct ic
{};
template <size_t N>
class Foo < class ic<N> >
{
public:
   static const bool is_number = true;
   size_t getN() const
   {
      return N;
   } 
};

int main()
{
   Foo<int> p;  
   Foo<ic<15> > p2;  
   cout << "p.is_number = " << p.is_number << endl;
   cout << "p2.is_number = " << p2.is_number  << endl;
   cout << "p2.getN() = " << p2.getN() << endl;
   return 0;
}