次のコード(私がしたいことをやって、適切にコンパイルして実行する)は、ポインタが型を知らなくなったときにポインタを削除する必要があるさまざまな型のプロパティを格納するクラスを書く際に経験した奇妙な例です。私の解決策は、特定の型を削除するためにアドレスを取得して格納できるテンプレート関数を使用して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は、Microsoft拡張機能障害者
出力:
破壊
あなたも '#include ' –
@Travisとすることを前提としています。それは問題なくコンパイルできますが、分かりやすくするために追加しました。 – 0x5f3759df