下面的代碼(編譯和正確執行,做我想做的事)是我在編寫類時存儲的一個奇怪例子,它存儲了各種類型的屬性,這些屬性需要在不再知道它們的類型時刪除指針的能力。我的解決方案是使用模板化函數創建一個Deleter類,該類可以獲取並存儲其地址以刪除特定類型。 我不明白爲什麼這個代碼工作,具體如下:不相關的專業化必須存在編譯?
- 爲什麼不把它打到斷言?
- 爲什麼/如何要求/使用(看似)不相關的專業化?
代碼:
#include <iostream>
#include <string>
#include <cassert>
#include <locale> //Just here as an unused class to specialize
using namespace std;
typedef void(*void_voidptr_func_t)(void*);
class ClassWithDestructor {
public:
~ClassWithDestructor() {
cout << "Destroyed\n";
}
};
class Deleter {
public:
template <class T>
static void Delete (T* ptr) {
assert(0);
}
//locale here can be any class
//it doesn't matter what class it is
//but if this specialization doesn't exist
//compile fails
template <class locale>
static void Delete(void* ptr) {
delete (locale*)ptr;
}
};
void* void_ptr_to_T = NULL;
void_voidptr_func_t T_delete_function = NULL;
template<class T>
void A() {
T* t = new T;
void_ptr_to_T = (void*)t;
T_delete_function = &Deleter::Delete<T>;
}
int main(int argc, char** argv) {
A<ClassWithDestructor>();
T_delete_function(void_ptr_to_T);
}
編譯器:MSVC++ 2010,微軟擴展殘疾人
輸出:
銷燬
我假定你也是爲了'#include' –
@Travis - 它沒有它就編譯好,但爲了清晰起見我添加了它。 – 0x5f3759df