C++ 一整套参数的模板专业化

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,int)和(T,double),只有一个模板定义

我能做的就是定义(T,int)的专业化。见下文。但是,它应该是(T,int)和(T,double),并且只有一个函数定义(没有代码加倍)

模板
结构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
需要两个类型参数,因此我在从它派生时传递它们好主意!你是对的。它不是一个定义,但避免了代码加倍。就目前的情况而言,它是有效的。