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
不是专门化,它是一个完全不同的模板(它不接受相同类型的参数)。与函数不同,模板不能重载(不过,我不知道是否有充分的理由进行此限制。如果有人对此有解释,我很乐意听到。)。