Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;模板:如何通过std::is_指针有条件地删除值_C++_Templates - Fatal编程技术网

C++ C++;模板:如何通过std::is_指针有条件地删除值

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" <

在一个通用容器的析构函数中,我尝试删除元素(如果它们是指针),所以我在下面尝试。但当我使用T=double进行测试时,编译器显示了一条错误消息,即delete后面必须跟指针。我怎样才能正确地做到这一点

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*
)顺便说一句。@Nawaz
T 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;
}