C++ &*对于原始指针、迭代器和。。。std::nullptr\t
我有一个模板函数,如果它的参数是一个原始指针,或者有一个std::iterator类别,或者是一个std::nullptr_,那么它可以通过std::enable_启用。在该函数中,数据成员的原始指针设置为等于参数,如下所示: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,它失败了。是否有任何解决方案可以避免编写两个不同的函数 谢谢
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);