c++模板部分专业化
c++ template partial specialization
这可能是以前有人问过的问题,但我找不到…
我在.hpp
文件中有一个类:
class A{
public:
A(){//constructor}
~A(){//destructor}
//some public methods and arguments
template<typename Type>
void func(Type t){//do something for numbers}
private:
//some private methods and arguments
}
template方法应该适用于int、double。。。但不适用于字符串。因此,在我的.hpp
文件中,我定义了func
对数字的作用,并在.cpp
文件中写道:
template<>
void A::func(std::string t){ // do something in that case}
但当我将函数func
与std::string
一起使用时,程序会调用数字的方法。。。因此,我将.hpp
文件替换为:
class A{
public:
A(){//constructor}
~A(){//destructor}
//some public methods and arguments
template<typename Type>
void func(Type t){//do something for numbers}
void func(std::string s);
private:
//some private methods and arguments
}
我的.cpp
文件变成了:
void A::func(std::string t){ // do something in that case}
然后一切正常!
我的问题是,这样做正确吗?
这不是部分专门化(没有未专门化的模板参数),而是显式专门化。
模板必须对使用它们的代码可见,如果你没有在头文件中声明专门化,那么试图用string
调用A::func
的代码将实例化主模板(表示数字的模板)并使用它,因为他们甚至不知道字符串专门化的存在。
因此,您必须(至少)在标头中声明专门化,以便它在.cpp
文件之外可用:
template<>
void A::func(std::string t);
然而,使用重载的替代方案更简单,完全可以接受。它之所以有效,是因为string
的重载是在标头中声明的,所以调用它的代码知道要调用哪个函数。
重载对于许多目的来说都是一种很好的方法。然而,我怀疑,如果您也为const char *
添加一个专门化,那么您原来的模板方法也可以工作。这样,您就可以在不解析为数字版本的情况下传入字符串文字。
相关文章:
- 如何使用默认参数等选择模板专业化
- 模板化建造师专业化
- 类模板的成员功能的定义在单独的TU中完全专业化
- 如何用RISC-V GD32VF103CBT6开发板卸载精确的ADC过采样
- 如何将部分流作为参数传递
- 部分专业化和嵌套模板
- 模板专业化可以进入我的.cpp吗?
- 我是 c++ 的新手.学习基本知识后,我想做井字游戏.对于印刷板,我在下面写代码,但它显示错误
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- HDF5Cpp 扩展复合数据集超板问题
- 部分专业化和对标准::void_t<>的需求
- "专业化不参与超载"
- 特定好友功能专业化
- 是否可以混合使用SFINAE和模板专业化?
- 有没有办法修改'operator->',以便'z->im'返回复数的虚部
- C++剪贴板队列粘贴随机结果?
- 将缓冲区复制到剪贴板 [换行错误]
- 为什么在班级专业化上会出现错误?
- enable_if如何帮助选择类模板的专业化?
- 如何在部分类模板专业化中实现继承