どうにかして無料でオーバーロードできますか
あなたは確かにそれを試してみることができます. 例えば:
#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
は でありmy::free
、コードはコンパイルに失敗します。以外の引数を使用しfree((void*)ptr);
た への呼び出しは影響を受けないため、明らかにこれは をキャッチしません。free
my::TYPE*
私が書いたように、free
namespace 内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);
};
}