のは、私はこのコードを持っているとしましょう:のstd :: STD上get_deleter :: STDを使用して初期化するshared_ptr ::バインド
class BaseObject
{
public:
virtual void OnDestroy() {}
};
template <typename T>
struct myArrayDeleter
{
void operator()(T *p, std::size_t count)
{
for(std::size_t i = 0; i < count; i++)
{
static_cast<BaseObject*>((void*)(int(p) + sizeof(T) * i))->OnDestroy();
}
delete [] p;
}
};
そして、意図したとおりのは、それが動作することを想定してみましょう(それはせずに今書かれた、簡易版ですチェックしますが、基本的にはこのコードが何をすべきかを知っています)。
この部分では問題はありません。ただし、これをチェックしてください:
ただし、方法は機能していません。それはshared_ptr
をstd::bind
に初期化したためです。 std::get_deleter
は、テンプレートに間違ったタイプが指定されているため、常にnullptr
を返します。どのタイプを渡すべきかわかりません。私はtypeid(U) == typeid(*m_shared.get())
で行くことができる知っているが、これは私が欲しいものではありません
template <typename U>
bool IsExactlyOfType()
{
if(!m_shared)
return false;
return ((void*)std::get_deleter<myDeleter<U>>(m_shared) != nullptr;
}
:私はmyDeleter
は一引数でファンクタであり、それがこのようなコードで完璧に動作する非配列のコードでも試してみました。私ははるかに複雑なコードを持っており、その場合はこのメソッドだけが良いです。
もっと熟練したプログラマーは、指定するタイプをstd::get_deleter
に教えてください。
あなたのDeleterでは、ポインタが 'int'に収まらない場合はどうなりますか? 'sizeof(T *)> sizeof(int)'ならば?単純に '&p [i]'を使わないのはなぜですか? –
まあ、私はコードでかなり複雑に書いていますが、基本的には意図どおりに動作しますが、ここではその点は重要ではありません。要点は、std :: get_deleterに指定する型がわからないということです。 – RazzorFlame
私はあなたが実際のコードで 'int(p)'のようなキャストを使用していないことを期待しています。 ***はすべての64ビットシステムについて壊れます。 –