class のオブジェクトが与えられた場合、コピーを作成せずstd::basic_string<char, std::char_traits<char>,my_allocator<char> >
に class のオブジェクトへの定数参照を期待するサードパーティ関数にどのように渡しますか?std::string
私が考えているのは、ステートレス アロケーターを仮定すると、理論的には、2 つの型は実行時にまったく同じになるはずだということです。したがって、型のキャストを単純に再解釈できます。次に例を示します。
// my_allocator template is some place else...
typedef std::basic_string< char, std::char_traits<char>,
my_allocator<char> > my_string;
void third_party_foo(const std::string &s);
int main()
{
const my_string str = "Hello, world!";
third_party_foo(*(const std::string *)&str);
}
状態を持つアロケーター (C++11 以降で使用可能) を考えると、実行時のこれらのクラスのサイズとレイアウトが異なる可能性があるため、これははるかに危険であると思います。これまでのところ正しければ、2 つのクラスのオブジェクトのサイズが同じであるとしましょう。その場合、アロケーターの状態が、たとえば、そうでなければパディングされるはずの領域に収まると仮定できます。その場合、最初のアプローチ働ける。
実際に言えば、このアプローチで自分自身をどれだけ危険にさらすことができますか? 実行時のオーバーヘッドを伴わない代替手段はありますか (もちろん、サードパーティ インターフェイスを変更したり、カスタム アロケータで文字列を放棄したりする必要はありません)。