テンプレートを介して静的ポリモーフィズムを使用するC++ライブラリに取り組んでいます。ターゲットは小さなスタックを持つ組み込みシステムであり、多くの場合inline
、スタックの使用量を節約するためにメンバー関数にとって有益であるため、このように設計されています。
静的ポリモーフィズムにテンプレートを使用するということは、イベントエミッターのタイプ(ほとんどの場合、デバイスドライバー)の名前が非常に長いことが多いことを意味します。
class DeviceThatUsesSPI<class SPI_BUS_TYPE> {
public:
class DeviceEvent : public Event<DeviceThatUsesSPI> {};
// and the rest of the device driver implementation, including
// the code that emits that event.
}
SomeSpecificGpioBus gpio_bus();
SoftwareSpiBus<typeof(gpio_bus)> spi_bus(&gpio_bus);
DeviceThatUsesSPI<typeof(spi_bus)> device(&spi_bus);
ご覧のとおり、GCCtypeof
拡張演算子を使用して、不快な型名全体DeviceThatUsesSPI<SoftwareSpiBus<SomeSpecificGpioBus>>
を繰り返し書き出さないようにしています。これは、今日まで試したすべての場所で魅力のように機能し、イベントを表すネストされたクラスにアクセスするために使用しようとしました。私の現在の例では、これはテンプレートの特殊化であり、コンパイル時のイベントハンドラーバインディングを実装しています。
template<>
inline void event_handler<typeof(device)::ExampleEvent>(typeof(device) *emitter) {
// event handler implementation...
}
ただし、変数宣言のはるかに最小限の例でもこれを試しました。
typeof(device)::ExampleEvent event;
どちらの場合も、G++は構文エラーで式の解析に失敗します。これは、標準のC ++文法では::
、識別子以外の何かが続く状況がなく、パーサーがコロンに遭遇したときに最初の部分をタイプとしてバックトラックして処理できないためだと思います。
ただし、GCCマニュアルでtypeof
は、この演算子について次のように約束しています。
構成は
typeof
、typedef名を使用できる場所であればどこでも使用できます。たとえば、宣言、キャスト、またはまたはの内部で使用できsizeof
ますtypeof
。
私の例の2つの使用法をtypedefに置き換えるtypeof
と、G++は満足です。
typedef typeof(device) device_type;
template<>
inline void event_handler<device_type::ExampleEvent>(typeof(device) *emitter) {
// event handler implementation...
}
device_type::ExampleEvent event;
したがって、これは、コンパイラーが私が意味的に書いたもので問題がないという私の疑いをさらに助長しますが、文法は私がそれを表現することを許可しません。typedef間接参照を使用するとコードが機能しますが、このライブラリのユーザーの便宜のために、イベントハンドラー宣言を自己完結型にする方法を見つけたいと思います。typeof
イベント宣言をワンライナーにできるように、解析のあいまいさを取り除く演算子を作成する方法はありますか?