问题
具体来说,我希望以下代码失败:
- void a(void*){}
- int main(){
- a(0); // FAIL
- a(NULL); // FAIL
- a(nullptr); // success
- }
复制代码
我希望编译以下代码:
- void a(int){}
- void a(void*){}
- int main(){
- a(0); // calls first a
- a(NULL); // calls first a; that's why I have -Werror
- a(nullptr); // calls second a
- }
复制代码
以下代码目前无法编译,但应该按照我的规则工作:
- void a(std::size_t){}
- void a(void*){}
- int main(){
- a(0); // two candidates
- }
复制代码
你知道如何让 g++ 做到这一点吗?
回答
这可能并不完美,但如果你真的想使用 int 和指针重载,你可以使用这样的辅助类:
- #include <iostream>
- #include <iomanip>
- using std::cout;
- using std::endl;
- template<typename T = void> class ptr {
- T* it;
- public:
- ptr(T* it = nullptr): it(it) {}
- ptr(const ptr<T>&) = default;
- ptr& operator = (const ptr<T>&) = default;
- operator T* () { return it; }
- T& operator * () { return *it; }
- T* operator -> () { return it; }
- ptr& operator += (int x) { it += x; return *this; }
- ptr& operator -= (int x) { it -= x; return *this; }
- ptr& operator ++ () { ++it; return *this; }
- // etc...
- public:
- template<typename P>
- ptr(P* it): it(it) {}
- template<typename P>
- ptr(ptr<P> it): it((T*)it) {}
- };
- template<> class ptr<void> {
- void* it;
- public:
- ptr(void* it = nullptr): it(it) {}
- ptr(const ptr<void>&) = default;
- ptr& operator = (const ptr<void>&) = default;
- operator void* () { return it; }
- public:
- template<typename P>
- ptr(P* it): it(it) {}
- template<typename P>
- ptr(ptr<P> it): it((void*)it) {}
- };
- void a(std::size_t x) {
- cout << "first: " << x << endl; }
- void a(ptr<const int> p) {
- cout << "second: " << (p ? *p : -1) << endl; }
- void a(ptr<int> p, ptr<> q) {
- cout << "third: " << (p ? *p : -1) << ", "
- << (q ? "some" : "null") << endl;
- a(p); }
- int main(){
- a(0); // first: 0
- a(NULL); // first: 0 but warning [-Wconversion-null]
- a(new int(3), nullptr); // third: 3, null + second: 3
- }
复制代码
它还没有完成(可能删除显式,添加更多运算符,从 nullptr_t 进行特殊转换等),只是一个想法。
编辑:对代码、模板构造函数和转换为 ptr<const int> 的更改很少测试。
|