ホームページ > バックエンド開発 > C++ > C に同等の「テンプレート」はありますか?

C に同等の「テンプレート」はありますか?

Mary-Kate Olsen
リリース: 2024-11-06 05:26:02
オリジナル
332 人が閲覧しました

Is There a `template` Equivalent in C  ?

Can You Mimic Template?

C のテンプレート メタプログラミング機能を使用すると、開発者は強力で効率的なコードを作成できます。ただし、特定のシナリオでは、引数をテンプレートに渡すのが面倒になる場合があります。次のコードを考えてみましょう:

<code class="cpp">struct Foo {
  template<class T, T X>
  void bar() {
    // do something with X, compile-time passed
  }
};

struct Baz {
  void bang() {}
};

int main() {
  Foo f;
  f.bar<int, 5>();
  f.bar<decltype(&Baz::bang), &Baz::bang>();
}</code>
ログイン後にコピー

この例では、型を明示的に指定し、実際の値を引数としてテンプレート バーに渡す必要があります。

この構文を簡略化することは可能ですか? ?次のように表現できますか:

<code class="cpp">struct Foo {
  template<auto X>
  void bar() {
    // do something with X, compile-time passed
  }
};

struct Baz {
  void bang() {}
};

int main() {
  Foo f;
  f.bar<5>();
  f.bar<&Baz::bang>();
}</code>
ログイン後にコピー

答え:

残念ながら、C にはこの構文を実現する直接的な方法がありません。最も近い代替案は マクロ:

<code class="cpp">#define AUTO_ARG(x) decltype(x), x

f.bar<AUTO_ARG(5)>();
f.bar<AUTO_ARG(&Baz::bang)>();</code>
ログイン後にコピー

別の代替案: Generators

主に型の明示的な指定を避ける方法を探している場合、ジェネレーター関数が実行可能な解決策になります:

<code class="cpp">template <typename T>
struct foo {
    foo(const T&amp;) {} // do whatever
};

template <typename T>
foo<T> make_foo(const T&amp; x) {
    return foo<T>(x);
}</code>
ログイン後にコピー

次のように書く代わりに:

<code class="cpp">foo<int>(5);</code>
ログイン後にコピー

を使用できます:

<code class="cpp">make_foo(5);</code>
ログイン後にコピー

これにより、引数の型が許可されます推測してコードを簡素化します。このアプローチはテンプレートを直接エミュレートするわけではないことに注意してください。構文ですが、テンプレートに引数を渡すための便利な代替手段を提供します。

以上がC に同等の「テンプレート」はありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート