模板模板功能的重载
overloading of template template function
我正在尝试声明一个函数,该函数初始化了智能指针。我写了两个作用于智能指针的函数的变体,一个作用于模板上的模板函数,一个作用于模板的模板。问题是,后者应该至少对STD :: simel_ptr和std :: shared_ptr作用。std :: unique_ptr One的构造与std :: shared_ptr的构建不同。std :: unique_ptr One采用两个模板参数(即对象类型和deleter),而std :: shared_ptr One只需一个(即对象类型)。
#include <iostream>
#include <memory>
template <typename Smartpointer>
void checkPointerinitialization(const Smartpointer& ptr){
if(!ptr.get())
std::cout<<"smart pointer is not initializedn"<<std::endl;
}
//template <template <typename, typename> class Smartpointer, typename Object, typename Deleter>
//void checkPointerinitializationWithTemplates(const Smartpointer<Object, Deleter>& ptr){
// if(!ptr.get())
// std::cout<<"smart pointer is not initialized in template function eithern"<<std::endl;
//}
//int main(){
// std::shared_ptr<int> myptr;
// checkPointerinitialization(myptr);
// checkPointerinitializationWithTemplates(myptr);
//
//}
template <template <typename> class Smartpointer, typename Object>
void checkPointerinitializationWithTemplates(const Smartpointer<Object>& ptr){
if(!ptr.get())
std::cout<<"smart pointer is not initialized in template function eithern"<<std::endl;
}
int main(){
std::shared_ptr<int> myptr;
checkPointerinitialization(myptr);
checkPointerinitializationWithTemplates(myptr);
}
我的解决方案是超载模板函数,但是,如果我输入第一个函数,我会从G 中获得模板扣除失败 - 模板参数错误消息。实际上是否可以以适当的方式超载模板功能?
,而不是将您的参数作为一个单个模板参数的类模板的实例化,而是将您的参数作为类模板作为类模板,将至少一个 template参数:
template <template <class, class...> class Z,
class Object,
class... Ts>
void foo(const Z<Object, Ts...>& ptr) { ... }
这将匹配std::unique_ptr<X>
(与Object=X
和Ts={std::default_delete<X>}
)和std::shared_ptr<X>
(使用Object=X
和Ts={}
)。
但是,这将不匹配任何非模板智能指针,例如:
struct MySpecialSnowflakeSmartPointer { ... };
所以您的第一种方法可能是最好的:
template <class SP>
void foo(SP const& ptr) { ... }
相关文章:
- 重载算子新功能的限制
- 隐藏重载虚拟功能的模板化访客:SFINAE 在使用?
- 预处理器是否可以更改运算符重载功能的符号?
- 对象内部对象的重载功能
- 重载模板功能
- 谷歌测试的重载功能
- & 字符在重载 std::cout 中的功能是什么?
- 如何通过运算符<<的重载访问受保护的功能?C++
- 算子一元重载功能
- 模板模板功能的重载
- 具有自动功能的模板函数的重载分辨率
- 将重载函数分配给功能指针作为默认值
- 为什么BOOST.RANGE RANGE_BEGIN/END FREE功能对const和非const引用都重载
- 如何重载iostream运算符以在整个流上执行功能
- 优先级队列中的运算符重载或比较功能C++
- 在C++中,重载运算符后,运算符是否会失去其旧功能
- 如何使用此独特的操作员重载功能
- 可以通过常量说明符重载功能
- 重载功能不明确
- 重载功能。为什么这里模棱两可?