& *表示原始指针,迭代器和... std :: nullptr_t

时间:2012-08-31 17:22:19

标签: c++ pointers reference nullptr

我有一个模板函数,它被启用(通过std :: enable_if),它的参数是一个原始指针,或者是一个std :: iterator类,或者是一个std :: nullptr_t。在该函数中,原始指针(数据成员)被设置为等于参数,如:

template<class T> void myFunction(T it) 
{
    _ptr = &*it;
}

&amp; *适用于指针和迭代器......但它对于std :: nullptr_t失败了。是否有任何解决方案可以避免编写2个不同的函数?

谢谢。

2 个答案:

答案 0 :(得分:5)

最简单的方法是将函数更改为具有两个重载,一个用于存储指针的原始指针/ nullptr_t和一个SFINAE为当前实现的迭代器选择的一个,尽管您应该注意这将是在某些情况下失败(特别是如果iterator::value_type重载一元operator&)。

答案 1 :(得分:2)

与往常一样,我们可以使用 trait 来解决这个问题。这一次,我们不要写一个完整的类,因为一个简单的函数重载就足够了。

#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 _ptr = get_addr(it);

(如果T指向的类型重载operator&,此特征也有效。)

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