Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用表达式参数专门化模板_C++_Templates - Fatal编程技术网

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

C++ 使用表达式参数专门化模板,c++,templates,C++,Templates,我有一门课是这样的: template <class T> class Foo; 模板 Foo类; 我想有一个专业的 template <> class Foo < size_t N >; 模板 Foo类; 但这并不适合我: 我的主要观点是: Foo<int> p; // OK Foo<15> p2; // fails to compile foop;//好啊 Foo p2;//未能编译 我缺少什么?有三种模板参数:表示

我有一门课是这样的:

template <class T>
class Foo;
模板
Foo类;
我想有一个专业的

template <>
class Foo < size_t N >;
模板
Foo类
但这并不适合我:

我的主要观点是:

Foo<int> p;  // OK
Foo<15> p2;  // fails to compile
foop;//好啊
Foo p2;//未能编译

我缺少什么?

有三种模板参数:表示类型的参数(例如
类T
类型名T
),表示非类型的参数(例如
int N
size\u T N
),以及表示模板的参数(例如
模板类T


为模板定义的参数属于第一类(类型参数),但专门化采用第二类(非类型参数)。那不行。专门化的参数必须与主模板定义的相应参数具有相同的类型。

您不能这样做-您的模板始终采用一个类型参数。专门化只能比这更特殊,但不能不同(因此得名)

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

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;

    // ...
};
模板结构ValueWrapper{};
模板结构Foo;
模板结构Foo
{
T型;
静态类型常量值=Val;
// ...
};
用法:

Foo<char> x;
Foo<ValueWrapper<int, 15>> y;
foox;
福伊;

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

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;
}
模板
福班
{
公众:
静态常数布尔为_number=false;
};
模板
结构ic
{};
模板
Foo级
{
公众:
静态常数布尔为_number=true;
大小\u t getN()常量
{
返回N;
} 
};
int main()
{
福普;
foop2;

从另一个角度来看,这里有一个示例,带有冗余的模板参数:@jogojapan:“三种模板”-这更像是一种模板参数类型的情况…任何给定的模板都可以混合和匹配这些“类型”的参数@TonyDelroy True。我的回答隐含地假设只有一个模板参数,因为OP的例子就是这样。我已经重新编写了它。谢谢。怎么样?@LucTouraille:当然,为什么不:-)你的第二个
Foo
不是专门化,它是一个完全不同的模板(它不接受相同类型的参数)。与函数不同,模板不能重载(不过,我不知道是否有充分的理由进行此限制。如果有人对此有解释,我很乐意听到。)。