我能以某种方式免费超载吗
你当然可以试一试。例如:
#include <cstdlib>
#include <iterator>
namespace my {
class TYPE { };
template <typename T>
void free(T *ptr) { std::iterator_traits<T>::attempt_to_free_TYPE; }
}
using std::malloc;
using std::free;
using my::TYPE;
int main() {
TYPE *ptr = (TYPE *) malloc(sizeof(TYPE));
free(ptr);
}
感谢 ADL,该调用free
是 to my::free
,因此代码无法编译。显然这不会捕获free((void*)ptr);
,因为free
使用参数以外my::TYPE*
的参数调用不受影响。
正如我所写,不需要对free
内部命名空间my
或具有using namespace my;
. 因此,您可能希望为此目的使用新发明的命名空间。或者写一个不那么全面的模板,我即兴创作的。
它也没有捕捉到对std::free
. 重载(或命名空间 std 中的任何内容)是未定义的行为std::free
,但如果有必要,您可能会为了查找调用站点而侥幸逃脱。像这样的东西:
template <typename T>
struct allowed_to_free {
enum { value };
};
template <>
struct allowed_to_free<TYPE> {};
namespace std {
template <typename T>
void free(T *ptr) {
allowed_to_free<T>::value;
free((void*)ptr);
};
}