Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.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++ &*对于原始指针、迭代器和。。。std::nullptr\t_C++_Pointers_Reference_Nullptr - Fatal编程技术网

C++ &*对于原始指针、迭代器和。。。std::nullptr\t

C++ &*对于原始指针、迭代器和。。。std::nullptr\t,c++,pointers,reference,nullptr,C++,Pointers,Reference,Nullptr,我有一个模板函数,如果它的参数是一个原始指针,或者有一个std::iterator类别,或者是一个std::nullptr_,那么它可以通过std::enable_启用。在该函数中,数据成员的原始指针设置为等于参数,如下所示: template<class T> void myFunction(T it) { _ptr = &*it; } &*适用于指针和迭代器。。。但是对于std::nullptr\t,它失败了。是否有任何解决方案可以避免编写两个不同的函数 谢谢

我有一个模板函数,如果它的参数是一个原始指针,或者有一个std::iterator类别,或者是一个std::nullptr_,那么它可以通过std::enable_启用。在该函数中,数据成员的原始指针设置为等于参数,如下所示:

template<class T> void myFunction(T it) 
{
    _ptr = &*it;
}
&*适用于指针和迭代器。。。但是对于std::nullptr\t,它失败了。是否有任何解决方案可以避免编写两个不同的函数


谢谢。

一如既往,我们可以用一个特性来解决这个问题。这一次,我们不要编写完整的类,因为一个简单的函数重载就足够了

#include <cstddef>
#include <memory>

template <typename T>
T get_addr(T t) { return std::addressof(*t); } // #1

std::nullptr_t get_addr(std::nullptr_t np) { return np; }
如果T指向的类型重载运算符&,则此特性也有效


我们邀请您使用主模板中相同的enable_if条件来保护重载1。

最简单的方法是将函数更改为具有两个重载,一个用于仅存储值的原始指针/nullptr_t,另一个由SFINAE为当前实现的迭代器选择,虽然您应该注意到,在某些情况下,这将失败,特别是如果迭代器::value_type像往常一样重载一元运算符&。

,但这是一个特性-这次最好还对指针进行特殊处理,以防止取消对不指向有效内容的指针的引用。模板T*get_addrT*T{return T;}@nightcracker:我假设OP只会在enable-if'ed函数中使用它。否则你当然是对的。@KerrekSB:你永远不知道。加上它会痛吗?如果你不介意的话,我可以这样做。@Mr.Anubis:没错,这就是为什么在这种情况下我更喜欢函数重载集,而不是一组类模板专门化。即使是&*类型的*有重载运算符&,它也不起作用。
T _ptr = get_addr(it);