我的情况是我有一个现有的模板类,适用于所有类型的数据类型。但是现在我需要将它专门用于派生自特定类的类。但并不是整个班级应该是专业的,而只是一些功能。
我尝试按照this post中的描述进行操作。
TemplateClass<BaseClass>* tc1 = new TemplateClass<BaseClass>();
tc1->print_line();
TemplateClass<SubClass>* tc2 = new TemplateClass<SubClass>();
tc2->print_line();
TemplateClass<int>* tc3 = new TemplateClass<int>();
tc3->print_line();
我尝试使用这样的模板:
{{1}}
对于每个函数调用,我得到错误,没有找到拟合方法。 另一点是,在this article中他们说不应该使用enable_if来在实现之间进行选择。
有没有人知道我的错误是什么或如何正确地做到这一点? 提前谢谢!
答案 0 :(得分:1)
您可以将其更改为
template<typename U = T, typename std::enable_if<
!std::is_base_of<BaseClass, U>::value>::type* = nullptr>
void print_line()
{
std::cout << "Parameter of general Type T" << std::endl;
}
或
template<typename U = T>
typename std::enable_if<!std::is_base_of<BaseClass, U>::value, void>::type print_line()
{
std::cout << "Parameter of general Type T" << std::endl;
}
和另一个相应的。
两者背后的想法是在实例化函数模板期间为其中一个方法产生错误。由于该错误,在重载解析期间不考虑相应的方法,使得只有一个方法(不产生错误的方法)可用,然后将被调用。
std::enable_if
用于产生此错误,因为如果其第一个参数为false
,则它不会定义type
成员,因此无法实例化函数模板,并且将从重载解析中删除。< / p>
搜索SFINAE以获取更多详细信息。