0

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

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

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

谢谢你。

4

2 回答 2

5

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

于 2012-08-31T17:25:40.423 回答
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条件来保护过载。

于 2012-08-31T17:25:31.937 回答