私は組み込み用の C++ ライブラリを作成しているので、1) 効率的である必要があります。2)「効率的」は静的な制約セットに還元できないため、プログラマーがコード速度とサイズのトレードオフをケースバイケースで制御できるようにします。このニーズに対応するために、メソッドの大部分のサブセットのインライン機能をプログラマーが制御できるようにすることを検討しています。次のパターンが考えられます。
class Foo {
ALWAY_INLINE void foo_i() { ... }
NEVER_INLINE void foo_ni() { foo_i(); }
#if DEFAULT_INLINE
ALWAY_INLINE void foo() { foo_i(); }
#else
NEVER_INLINE void foo() { foo_i(); }
#endif
}
ここで、ALWAY_INLINE/NEVER_INLINE は、コンパイラ固有の属性の定義です (gcc だけをターゲットにしてよかったです)。そして、このスキームはメソッドの 3 つのバージョンを提供します: 常にインライン化されるもの、決してインライン化されないもの、および「デフォルト」のインライン化可能性を持つ「メイン」メソッド (ライブラリ作成者としての私の決定に基づく)。
現在、私はそのようなスキーム、特に _i/_ni サフィックスと冗長性について 100% 確信が持てません (後者はマクロで処理できますが、サフィックスよりもさらにあいまいになる可能性があります)。
C ++でこのようなメタプログラミングの問題を処理するためのベストプラクティス、または少なくともこれが他のライブラリでどのように処理されるかの既存の例があるのだろうか?
「コンパイラにインライン化を制御させる」というのは受け入れられる答えではないことに注意してください - 話はまさにそれを明示的に制御することについてです。