示例 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 A1 : public BaseTpl<int>
class A2 : public BaseTpl<std::string>
class A3 : public BaseTpl<vector<int> >
...