我有一个模板函数,它被启用(通过std :: enable_if),它的参数是一个原始指针,或者是一个std :: iterator类,或者是一个std :: nullptr_t。在该函数中,原始指针(数据成员)被设置为等于参数,如:
template<class T> void myFunction(T it)
{
_ptr = &*it;
}
&amp; *适用于指针和迭代器......但它对于std :: nullptr_t失败了。是否有任何解决方案可以避免编写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
。