姑且不论为什么会有这么个奇葩的需求, 总之, 我们希望的结果是:
这一段代码能正常编译通过:
class Test {
public:
void test(void) {
Test *p = this;
func(p);
func(this);
}
};
而这一段代码应该编译失败:
class Test {
public:
void test(void) const {
const Test *p = this;
func(p); // 此处应该编译失败
func(this); // 此处应该编译失败
}
};
很容易就能想到的版本:
template<typename T>
void func(T * const &)
{}
很可惜, 任意 const 指针也能匹配并正常编译通过
用了一些小歪门邪道的版本:
template<typename T>
void func(T * &)
{}
第一次见这种做法的时候惊讶不已, 然并卵, func(this); 无法正常编译通过, 因为 this 指针不可改
尝试使用各种 type traits 来限定指针类型:
template<typename T>
void func(std::remove_const<T>::type *const &)
{}
离最终方法很接近了, 不过很可惜, 这个依旧是编译不过的, 提示 "couldn’t infer template argument", 具体产生原因可以 参考这里
好吧, 最终方法:
template<typename T>
void _func(T *const &)
{}
template<typename T>
void func(T *const &p)
{
_func<std::remove_const<T>::type *>(p);
}
当我第一次看到这种做法时, 其实我是拒绝的, 可是它 duang 的一下就可以用了, 所以就屁颠屁颠的发文来了
(感谢 黒い風 提供的神奇的方法)
转载请注明来自: http://zsaber.com/blog/p/57
既然都来了, 有啥想法顺便留个言呗? (无奈小广告太多, 需审核, 见谅)