1

私はその問題について考え始めたところです。すべてのC++テンプレートは、クラス(または関数)オブジェクトを返す「通常の」関数に置き換えることができますか?通常はコンパイル時プログラムを意味します。

そのため、C ++コンパイルでのテンプレートのインスタンス化を「通常の関数(コンパイラの解析ツリーなどで動作するコンパイル時プログラムを意味する)」に置き換えたいので、declerative構文は使用しません。

次のアイデアで、C ++のテンプレートメカニズム全体を置き換えることができると思いますか?この方法でテンプレートを理解しやすくなると思いますか?少し理論的な質問ですが、この質問の種類について話し合うのに最適な場所はどこかわかりません。

template<typename T>
struct A
{
  int foo();
  bool bar;
  T data;
};

#if 0
class A(typename T) // class bulder after "("
{
  class ret;          // class object can only declared in class builder
  ret.name = "whatever_compile_time_string";
  ret += body         // body is a class builder member with class declaration syntax
         {
           body();    // constructor
           ~body();   // destructor
           int foo(); // method
           bool bar;  // member
         };
  ret += member(T, "data"); // "inject" a templated member

  return ret;
}
#endif


int main()
{
  A<int> a;
#if 0
  // create a new class
  typedef new class A(int) AInt;
  // or
  typedef new class A(int); // in this case class.name must be an initialized thing
#endif
}
4

4 に答える 4

3

はい。あなたが説明しているのはマクロシステムです。Cプリプロセッサは弱い形式のマクロを提供しますが、一般的な場合、マクロはコンパイル時に実行されるソースコード(ソースコードを入力として受け取る)を書き込むプログラムにすぎません。

さて、マクロの理論はやや複雑であることがわかりました。もちろん、コンパイル時にコードを実行できるマクロシステムなら何でもできますが、正しいことを簡単に行えるようにするために多くの作業が行われています。(特に、補間できる構文引用構造があると非常に役立ちます。)

強力なマクロシステムを使用すると、以前は言語に組み込まれていた多くのステートメントを代わりにユーザー定義にするか、標準ライブラリに含めることができます。

このテーマに興味がある場合は、Scheme、特にRacketプログラミング言語をご覧ください。Racketのコアは非常に小さく、ユーザーエクスペリエンスのほとんどすべての言語はマクロから構築されています。

于 2012-09-17T00:13:14.863 に答える
2

いいえ。テンプレートの主な点の1つは、静的に推論されたタイプセーフなポリモーフィズムを提供することです。

定義上、実行時にそれを行うことはできません。すべてをランタイムに移動する場合は、C ++を使用せず、遅延バインディング用に最適化されたものを使用してください。

更新:コンパイル時に実行される関数について話している場合、(a)C ++を解釈するコンパイラが必要になり(C ++で記述したい場合)、宣言型の関数型の利点が失われますテンプレートである言語。メリットがわかりません。

于 2012-09-16T16:45:39.193 に答える
1

C ++のテンプレートのように、Cプログラマーが同様の効果を実現するために使用する方法は2つあります。ただし、C++でテンプレートの代わりにこれらの方法を使用してもメリットはありません。ただし、テンプレートを理解するのが難しいと思われる場合は、次を確認してください。

マクロを使用することにより:

// N: typename, T: used type
#define MAKE_A(N, T)  class N { \
public: N(){} ~N(){}  bool flag; T data; }

MAKE_A(AInt, int);
MAKE_A(AFloat, float);

追加の実装ヘッダーファイルを使用することにより:

ファイル:ああ(包含ガードを配置しないでください):

// A_NAME: typename, A_TYPE: used type
class A_NAME { 
public: 
    A_NAME(){} 
    ~A_NAME(){}  
    bool flag; 
    A_TYPE data; 
};

使用法:

#define A_NAME AInt
#define A_TYPE int
#include "A.h"
#undef A_NAME
#undef A_TYPE 

#define A_NAME AFloat
#define A_TYPE float
#include "A.h"
#undef A_NAME
#undef A_TYPE 
于 2012-09-16T18:27:06.943 に答える
1

テンプレートに対するBOOST.PPの利点の1つは、BOOST.PPで生成されたプログラムが、少なくともブースト開発リストへのこの投稿によれば、テンプレートを使用した同等のプログラムよりも高速にコンパイルされることです。

線形ルックアップの代わりにハッシュを使用してgccの速度が向上したとしても、参照された投稿でWalter Brightが言及した制限のため、BOOST.PPの使用はさらに高速であると思います。

于 2012-09-18T20:23:04.190 に答える