gpt4 book ai didi

C++ 特化模板类中的单个方法

转载 作者:行者123 更新时间:2023-11-30 05:36:00 25 4
gpt4 key购买 nike

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

我试着按照 this post 中的描述去做.

class BaseClass
{
public:

bool DoSomething()
{
return true;
}
};

class SubClass : BaseClass
{
};

template<typename T, typename _Alloc = std::allocator<T>>
class TemplateClass
{
public:
template<typename U = T, typename std::enable_if<
!std::is_base_of<BaseClass, U>::value>::type>
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>::type>
void print_line()
{
std::cout << "Parameter of specific Type BaseClass" << std::endl;
}
};

我尝试像这样使用模板:

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();

对于每个函数调用,我都收到错误消息,没有找到合适的方法。还有一点就是在this article他们说不应该使用 enable_if 在实现之间进行选择。

有谁知道我的错误是什么或如何正确执行此操作?提前致谢!

最佳答案

您可以将其更改为

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 成员所以函数模板无法实例化,将从重载解析中删除。

搜索 SFINAE 以获取更多详细信息。

关于C++ 特化模板类中的单个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33655250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com