スペースだけが必要な場合は、単純に bind できますが::operator new、一般的にnew T[]は、より多くのことができます。残念ながら、::operator newはオーバーロードされているため、コンパイラはどれが必要かを認識できないため、適切なオーバーロードを取得するには「キャスト」する必要があります。tom1991tは、MSVC はキャストなしでコンパイルすると言っていますが、コンパイラがそれを行うことになっているとは思いません。
#include <functional>
#include <new>
int main() {
typedef void*(*newptr_type)(std::size_t);
typedef void(*delptr_type)(void*);
auto al = std::bind<void*>(newptr_type(::operator new), sizeof(char)*100);
auto dl = delptr_type(::operator delete);
auto field = (char*)al();
dl(field); //or just "delete[] field;"
}
これは一般的な場合と同じではないことに注意してください。これは、デストラクタnew T[]を構築したり、逆に::operator delete呼び出したりしないためです。ただし、char気にしないためです。
一部のコンパイラは、いかなる条件下でも関数ポインターのインライン化を拒否するため、ラムダを含む functionoid の方が適しています ( rcapoteで提案されているように)。このソリューションは、コンストラクタとデストラクタを処理でき、インライン化により高速に実行されるはずです。
auto al = [](){return new char[100];};
auto dl = [](char* p){delete[] p;};
auto field = (char*)al();
dl(field); //or just "delete[] field;"
コンパイルの証明