C++ 一整套参数的模板专业化
可能很容易解决,但很难找到解决方案: 有可能(部分)专门化一整套类型吗? 在示例中,“Foo”应该部分专用于(T,int)和(T,double),只有一个模板定义 我能做的就是定义(T,int)的专业化。见下文。但是,它应该是(T,int)和(T,double),并且只有一个函数定义(没有代码加倍)C++ 一整套参数的模板专业化,c++,templates,C++,Templates,可能很容易解决,但很难找到解决方案: 有可能(部分)专门化一整套类型吗? 在示例中,“Foo”应该部分专用于(T,int)和(T,double),只有一个模板定义 我能做的就是定义(T,int)的专业化。见下文。但是,它应该是(T,int)和(T,double),并且只有一个函数定义(没有代码加倍) 模板 结构Foo { 静态内联空隙应用(T a,T2 b) { cout如果我正确理解了您的问题,那么您可以编写一个基类模板并从中派生,如下所示: template <typename T,
模板
结构Foo
{
静态内联空隙应用(T a,T2 b)
{
cout如果我正确理解了您的问题,那么您可以编写一个基类模板并从中派生,如下所示:
template <typename T, typename U>
struct Foo_Base
{
static inline void apply(T a)
{
cout << "we are in the partial specialisation Foo_Base(T)" << endl;
}
};
template <typename T>
struct Foo<T, int> : Foo_Base<T, int> {};
template <typename T>
struct Foo<T, double> : Foo_Base<T, double> {};
模板
结构Foo_Base
{
静态内联无效应用(TA)
{
cout如果我正确理解了您的问题,那么您可以编写一个基类模板并从中派生,如下所示:
template <typename T, typename U>
struct Foo_Base
{
static inline void apply(T a)
{
cout << "we are in the partial specialisation Foo_Base(T)" << endl;
}
};
template <typename T>
struct Foo<T, int> : Foo_Base<T, int> {};
template <typename T>
struct Foo<T, double> : Foo_Base<T, double> {};
模板
结构Foo_Base
{
静态内联无效应用(TA)
{
cout我相信您可以使用Boost实现这一点,以实现您想要的类型的部分专业化。第3.1节展示了如何实现,并给出了以下示例:
template <class T, class Enable = void>
class A { ... };
template <class T>
class A<T, typename enable_if<is_integral<T> >::type> { ... };
模板
A类{…};
样板
A类{…};
我相信您可以使用Boost实现这一点,以实现您所需类型的部分专业化。第3.1节介绍了如何实现,并给出了以下示例:
template <class T, class Enable = void>
class A { ... };
template <class T>
class A<T, typename enable_if<is_integral<T> >::type> { ... };
模板
A类{…};
样板
A类{…};
编译器怎么可能知道在这里做什么?它怎么知道您要打印“partial double”
等?输出仅用于知道使用了哪个函数定义。编译器怎么可能知道在这里做什么?它怎么知道您要打印“partial double”
,等等?输出仅用于了解使用了哪个函数定义。感谢您的回答。不幸的是,您使用了在原始问题中应用的情况,而不是以这种方式。“两者都”类型需要作为函数参数。抱歉,我没有具体说明。@Frank:现在看看我的答案。现在Foo_Base
需要两个类型参数,因此我在从它派生时传递它们好主意!你是对的。它不是一个定义,但避免了代码加倍。就目前而言,它是有效的。谢谢你的答案。不幸的是,你sed是一种适用于原始问题的情况,并非有意采用这种方式类型需要作为函数参数。抱歉,我没有具体说明。@Frank:现在看我的答案。现在Foo_Base
需要两个类型参数,因此我在从它派生时传递它们好主意!你是对的。它不是一个定义,但避免了代码加倍。就目前的情况而言,它是有效的。