C++ 如何设计一个只接受非const指针的函数

By | 2015-08-31

姑且不论为什么会有这么个奇葩的需求, 总之, 我们希望的结果是:

这一段代码能正常编译通过:

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

既然都来了, 有啥想法顺便留个言呗? (无奈小广告太多, 需审核, 见谅)

Category: C++

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注