C ++专门用于模板类中的单个方法

时间:2015-11-11 16:33:35

标签: c++ templates specialization

我的情况是我有一个现有的模板类,适用于所有类型的数据类型。但是现在我需要将它专门用于派生自特定类的类。但并不是整个班级应该是专业的,而只是一些功能。

我尝试按照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来在实现之间进行选择。

有没有人知道我的错误是什么或如何正确地做到这一点? 提前谢谢!

1 个答案:

答案 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以获取更多详细信息。