例子1
如果我们有Base
和Derived
类
class Base
{};
class Derived : public Base
{};
和一个模板类
template <class T, class Enabler=void>
class Partialy
{
public:
void say()
{
std::cout << "Partialy Default" << std::endl;
}
};
接下来我们可以写一个偏特化:
template <class T>
class Partialy<T, typename std::enable_if<std::is_base_of< Base, T >::value>::type>
{
public:
void say()
{
std::cout << "Partialy special" << std::endl;
}
};
示例 1 可以正常工作。 (完整代码:http://ideone.com/4FyrD)
例子2
如果我将 Base
类模板设为一个:
template <class T>
class BaseTpl
{};
class DerivedTpl : public BaseTpl<int>
{};
下一个偏特化不起作用:
template <class T, class Ta>
class Partialy<T, typename std::enable_if<std::is_base_of< BaseTpl<Ta>, T >::value>::type>
{
public:
void say()
{
std::cout << "Partialy special with TPL" << std::endl;
}
};
示例 2 无法编译
编译器抛出错误 “template parameters not used in partial specialization:”
(完整代码:http://ideone.com/gZ6J2)
问题
那么问题来了。有什么方法可以编写适用于从 BaseTpl
派生的所有类的部分特化。
特化工作的类(class)列表:
class A1 : public BaseTpl<int>
class A2 : public BaseTpl<std::string>
class A3 : public BaseTpl<vector<int> >
...
最佳答案
按照您的方式,编译器不可能将 Ta
与任何类型相匹配。想象一下你有这个:
class DerivedTpl : public BaseTpl<int>, public BaseTpl<char>
{};
Ta
尝试匹配时会是什么类型?
对于您的特定问题,一种解决方案是在 BaseTpl
之上引入一个无所不包的基类:
class BaseNonTpl {};
template <class T>
class BaseTpl : BaseNonTpl
{};
然后,修改部分特化以查找该基类。
template <class T>
class PartialyTpl<T, typename std::enable_if<std::is_base_of< BaseNonTpl, T >::value>::type>
这样,编译器就不必尝试找出您打算使用的基类。
关于c++ - 使用从模板类继承的非模板类的部分特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12653922/