2011-08-08 4 views
4

私はJavaScriptのほうが新しいです。私は、C++のようなJSテンプレートクラスを作成したいと思います。例えば:JavaScriptテンプレートクラスの作成方法は?

template <typename T> 
class A 
{ 
public: 
    A(T x) 
    { 
     this.a=x; 
    } 
    ~A() 
    { 

    } 
    void print() 
    { 
     std::cout<<a<<std::endl; 
    } 
private: 
    T a; 
}; 

は、我々はこのように、このクラスを使用することができます:C++の場合

A<int> test(2); 
test.print(); 

は、それは簡単です。しかし、JSでは、どのように説明することができますか?どうもありがとう。

+3

を次のようにテンプレートクラスをしたいですか、なぜそれを使用動的に型指定された言語で? – aroth

+0

私はC++コードをJSコードに変換するだけで、この問題に遭遇します。この翻訳には何らかの方法がありますか? – greatsea

答えて

2

あなたがこれを行うことができます:

var A = function (x) { 
    var a = x; 
    this.print = function() { 
     console.log(a); 
    }; 
}; 

var test = new A(2); 
test.print(); // -> 2 

をこの場合、変数aは(thisの他のプロパティがあるとして)機能printが公開され、プライベートで、かつAは、テンプレートのコンストラクタ関数であります(プロトタイプオブジェクト)。

+0

これはうまくいくかもしれませんが、この方法を使用すると「テンプレート」を反映できません。他の方法がなければ、おそらくそれは良い方法です。ありがとう.. – greatsea

4

Javascriptはdynamically typed languageなのでジェネリック型を処理するためのテンプレートは必要ありません。つまり、Javascriptでは、関数は任意の型の引数を受け入れることができます。

は、あなたの質問の例のテンプレートと同じ機能を実現するには、Javascriptのコードオブジェクトリテラルを使用して、この(はるかに短い)を使用することがあります。

var A = { 
    print: function(value) { 
    document.write(value); 
    } 
} 

これには、同じように使用することができます。

A.print(2); 

JsFiddleでこのコードのsampeが動作しています。あなたは、コードをC++に、より密接に対応したい場合は

は、あなたの代わりに関数を使用して、このアプローチを使用することができます。

var test = A(2); 
test.print(); 

次のことができます。このように使用することができます

var A = function(value) { 
    return { 
    print: function() { 
     document.write(value); 
    } 
    } 
} 

JsFiddleのアクションを参照してください。

+0

私はそれを得た。ありがとう、mVChr :) – greatsea

0

あなたのケースでは、テンプレートパラメータはタイプなので、JavaScriptに反映する必要はありません。

しかし、あなたは関数ポインタ

typedef bool (*C) (const int&, const int&); 

template<C c> 
class my_class{ 

public: 
    void my_method(){ 
     // use c 
     // ... 
    } 

}; 

のようなものを持っていた場合は、

var my_class_t = function(c){ 

    var my_class = function(){ 
    }; 

    my_class.prototype.my_method = function(){ 
     // use c 
     // ... 
    }; 

    return my_class; 
}; 

にそれを翻訳でき、

var my_class = my_class_t(function(a, b){return a < b;}); 
var my_instance = new my_class(); 
my_instance.my_method(); 
関連する問題