3

我有这样的课:

template <class T>
class Foo;

我想有一个专业

template <>
class Foo < size_t N >;

但这不适合我:

我的主要是这样的:

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

我错过了什么?

4

3 回答 3

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;
于 2012-08-15T06:15:34.730 回答
3

模板参数分为三种:表示类型的参数(例如class Tor typename T)、表示非类型的参数(例如int Nor size_t N)和表示模板的参数(例如template <class T2> class T)。

为您的模板定义的参数属于第一类(类型参数),但特化假定为第二类(非类型参数)。那是行不通的。特化的参数必须与主模板定义的相应参数类型相同。

于 2012-08-15T04:27:50.710 回答
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;
}
于 2012-08-15T06:27:31.727 回答