C++11 有没有一种方法可以从泛型类模板的专门化调用泛型类模板的实现?

C++11 有没有一种方法可以从泛型类模板的专门化调用泛型类模板的实现?,c++11,template-specialization,C++11,Template Specialization,我有一个模板类 template<typename T> class D : public B {...} 模板 D类:公共B{…} 其中B是在类D中实现的纯虚拟接口。但是,对于一种类型T0,该实现具有附加数据和处理该数据的附加成员函数。因此,我必须为这种情况专门指定D类: template<> class D<T0> : public B {...} 模板 D类:公共B{…} 同时,此专门化中所有其他方法的实现与泛型完全相同,我不想复制粘贴它。问题是

我有一个模板类

template<typename T>
class D : public B {...}
模板
D类:公共B{…}
其中B是在类D中实现的纯虚拟接口。但是,对于一种类型T0,该实现具有附加数据和处理该数据的附加成员函数。因此,我必须为这种情况专门指定D类:

template<>
class D<T0> : public B {...}
模板
D类:公共B{…}
同时,此专门化中所有其他方法的实现与泛型完全相同,我不想复制粘贴它。问题是,如果可能的话,如何从类
D
调用类D中的泛型实现

当然,正如@MaxLanghof和@Klaus所建议的,有一个中间派生类C的解决方案。然而,在这个解决方案中,可以实例化类
C
,这是我不想要的。如果没有其他解决方案,我将使用此解决方案作为最后手段。也许在C++11/14中有一些现代的构造可以在这种情况下提供帮助

同时,此专门化中所有其他方法的实现与泛型中的实现完全相同

因此,您应该将通用代码拆分为一个公共基类,并从通用模板和专用模板的新中间类派生。在模板专门化上进行完整的代码复制是没有意义的

由于此通用代码现在是一个通用基类,因此您可以简单地调用该方法,而无需任何特殊语法或技巧,因为它们是通用的

编辑:关于注释:如何保护实例化中间类对象:

C++中有关键字<代码>保护< /代码>,这使得可以保护对构造函数的访问。

例如:

class B{};
class T0;


template<typename T>
class C : public B /* all the non-specialized implementation of D */
{
    protected: C() {}
};


// Use the non-specialized implementation by default
template<typename T>
class D : public C<T> {};

// Add more functionality in the specialized case
template<>
class D<T0> : public C<T0> { /* your additional functionality */ };

int main()
{
    D<int> dint;
    D<T0>  dt0;

    C<int> Cint; // fails
    C<T0> Ct0;   // fails
}
B类{};
T0类;
样板
C类:公共B/*D的所有非专业实现*/
{
受保护:C(){}
};
//默认情况下使用非专用实现
样板
D类:公共C{};
//在特殊情况下添加更多功能
样板
D类:公共C{/*您的附加功能*/};
int main()
{
D力;
D-dt0;
C Cint;//失败
C Ct0;//失败
}
同时,此专门化中所有其他方法的实现与泛型中的实现完全相同

因此,您应该将通用代码拆分为一个公共基类,并从通用模板和专用模板的新中间类派生。在模板专门化上进行完整的代码复制是没有意义的

由于此通用代码现在是一个通用基类,因此您可以简单地调用该方法,而无需任何特殊语法或技巧,因为它们是通用的

编辑:关于注释:如何保护实例化中间类对象:

C++中有关键字<代码>保护< /代码>,这使得可以保护对构造函数的访问。

例如:

class B{};
class T0;


template<typename T>
class C : public B /* all the non-specialized implementation of D */
{
    protected: C() {}
};


// Use the non-specialized implementation by default
template<typename T>
class D : public C<T> {};

// Add more functionality in the specialized case
template<>
class D<T0> : public C<T0> { /* your additional functionality */ };

int main()
{
    D<int> dint;
    D<T0>  dt0;

    C<int> Cint; // fails
    C<T0> Ct0;   // fails
}
B类{};
T0类;
样板
C类:公共B/*D的所有非专业实现*/
{
受保护:C(){}
};
//默认情况下使用非专用实现
样板
D类:公共C{};
//在特殊情况下添加更多功能
样板
D类:公共C{/*您的附加功能*/};
int main()
{
D力;
D-dt0;
C Cint;//失败
C Ct0;//失败
}
添加另一层

template<typename T>
class C : public B { /* all the non-specialized implementation of D */ };
// (possibly hide this in some implementation detail namespace)

// Use the non-specialized implementation by default
template<typename T>
class D : public C {};

// Add more functionality in the specialized case
template<>
class D<T0> : public C { /* your additional functionality */ };
模板
C类:公共B{/*所有非专业化的D*/}实现;
//(可能将其隐藏在某个实现细节命名空间中)
//默认情况下使用非专用实现
样板
D类:公共C{};
//在特殊情况下添加更多功能
样板
D类:公共C{/*您的附加功能*/};
添加另一层

template<typename T>
class C : public B { /* all the non-specialized implementation of D */ };
// (possibly hide this in some implementation detail namespace)

// Use the non-specialized implementation by default
template<typename T>
class D : public C {};

// Add more functionality in the specialized case
template<>
class D<T0> : public C { /* your additional functionality */ };
模板
C类:公共B{/*所有非专业化的D*/}实现;
//(可能将其隐藏在某个实现细节命名空间中)
//默认情况下使用非专用实现
样板
D类:公共C{};
//在特殊情况下添加更多功能
样板
D类:公共C{/*您的附加功能*/};

感谢您在我的prosa答案中提供代码示例。我们应该合并答案:-)@Klaus你得到我的许可,可以将密码放入你的答案中,我会在之后删除我的:)感觉观众已经在他们的大脑中进行了合并:-)@MaxLanghof,我朝这个方向想,但觉得不太好。原因是用户可以实例化类
C
,这是我不希望发生的。另一方面,我在某处听说或读到C++11为这种情况提供了一些新的构造。@Ilia这就是为什么我提到“可能在一些实现细节名称空间中隐藏它”。首先,您的用户不得使用那里的任何东西(就像他们不允许使用
std
构造的任何实现细节一样)。感谢我的prosa答案中的代码示例。我们应该合并答案:-)@Klaus你得到我的许可,可以将密码放入你的答案中,我会在之后删除我的:)感觉观众已经在他们的大脑中进行了合并:-)@MaxLanghof,我朝这个方向想,但觉得不太好。原因是用户可以实例化类
C
,这是我不希望发生的。另一方面,我在某处听说或读到C++11为这种情况提供了一些新的构造。@Ilia这就是为什么我提到“可能在一些实现细节名称空间中隐藏它”。你的用户一开始不能使用那里的任何东西(就像他们不允许使用
std
构造的任何实现细节一样)。我更喜欢特殊的语法或技巧,以便不允许对中间模板类C实例化类
C
。哦,这会有所帮助。谢谢!我接受你的邀请