非常にめったに使用されないいくつかのメンバー オブジェクトを含む軽量のテンプレート化されたクラスを持っているので、実際に使用するまれなケースを除いて、それらのコンストラクターとデストラクターを呼び出すことは避けたいと思います。
そのために、クラスで次のように「宣言」します。
template <class K, class V> class MyClass
{
public:
MyClass() : wereConstructorsCalled(false) {/* empty */}
~MyClass() {if (wereConstructorsCalled) MyCallPlacementDestructorsFunc();}
[...]
private:
bool wereConstructorsCalled;
mutable char keyBuf[sizeof(K)];
mutable char valBuf[sizeof(V)];
};
...そして、placement new とplacement delete を使用して、実際にそうする必要がある場合にのみ、オブジェクトを設定および破棄します。
C++ FAQ を読むと、placement new を使用するときは、placement が適切に配置されていることに注意する必要があると書かれていました。そうしないと、問題が発生する可能性があります。
私の質問は、keyBuf 配列と valBuf 配列がすべての場合に適切に配置されるか、またはそれらが適切に配置されることを確認するために実行する必要がある追加の手順があるかということです。(そうであれば、プラットフォームに依存しないステップが望ましいでしょう)