C++ C++;模板:如何通过std::is_指针有条件地删除值
在一个通用容器的析构函数中,我尝试删除元素(如果它们是指针),所以我在下面尝试。但当我使用T=double进行测试时,编译器显示了一条错误消息,即delete后面必须跟指针。我怎样才能正确地做到这一点C++ C++;模板:如何通过std::is_指针有条件地删除值,c++,templates,C++,Templates,在一个通用容器的析构函数中,我尝试删除元素(如果它们是指针),所以我在下面尝试。但当我使用T=double进行测试时,编译器显示了一条错误消息,即delete后面必须跟指针。我怎样才能正确地做到这一点 template<class T> static void deleteIfPointer(T t) { if(std::is_pointer<T>::value) { std::cout << "is pointer" <
template<class T> static void deleteIfPointer(T t)
{
if(std::is_pointer<T>::value)
{
std::cout << "is pointer" << std::endl;
delete t;
}
else
std::cout << "not pointer" << std::endl;
}
模板静态void deleteiffointer(T)
{
if(std::is_指针::值)
{
std::cout模板
静态void deleteIfPointer(常量T&T)
{
std::之所以会发生这种情况,是因为编译器必须编译行delete t
,而不管if
的条件是什么。如果你把那行注释掉,你的代码就会编译得很好,并给出预期的结果。我会接受Piotr S的答案。我的二分钱:我不会这样做(因为这是非常奇怪的所有权)并让容器保存std::unique\u ptrs+1,以避免事情过于复杂。传递T const&
(和T const*
)顺便说一句。@NawazT const&
我同意。T const*
是不必要的-T
可以被推断成const U
很好。@Angew:显式比隐式好。显式是对世界的“宣告”。@Nawaz你有一个精确的匹配(T const&
和T
是指针的类型)vs资格转换。第一个获胜。
template <class T>
static void deleteIfPointer(const T& t)
{
std::cout << "not pointer" << std::endl;
}
template <class T>
static void deleteIfPointer(T* t)
// ^
{
std::cout << "is pointer" << std::endl;
delete t;
}