2016-05-06 6 views
-1

言ってやる例えば、私は2次元配列から値を返す関数を持っている:テンプレートを使用しない汎用プログラミングを使用できますか?

float get_2d_noise(const point& p) 
{ 
    return map2D[p.x][p.y]; 
} 

pointが、私は私のライブラリの一部として定義したクラスです。

struct point 
{ 
    int x; 
    int y; 
} 

これを除いて:

template<typename T> 
float get_2d_noise(const T& p) 
{ 
    return noisemap[p.x][p.y]; 
} 

同じ効果を得ることはできますか?つまり、xとyのメンバーを持つものが動作するような方法でget_2d_noiseを作成しますか? (好ましくは実行時ではなくコンパイル時にエラーが発生する)。

+6

あなたはテンプレートで行うことができないことをやりたいんでしょうか? – user463035818

+1

btw 'T'のxとyのメンバーを' int'に変換することができる場合にのみ関数が機能します – user463035818

+0

理論計算機科学ははいを示唆しています。 CとC++の両方がTuring Complete言語です。つまり、他の言語と同じように強力です。 C++にはテンプレートがあり、Cにはありません。したがって、Cはジェネリックプログラミングのサンのテンプレートをサポートできると結論づけることができます。 – erip

答えて

0

パラメータとして型の名前をとり、目的の関数を作成するマクロを記述することができます。あなたは、テンプレートのすべての表現力を失うとマクロに付属しているすべての問題を積むしかし

float get_2d_noise(const someType& p) { 
    return noisemap[p.x][p.y]; 
} 

に拡大します

CREATE_2D_NOISE_FOR(someType) 

ような何かが、これは非常に、推奨されません。

0

あなたが何をしたいかについて文法的に明示されている可能性があります。 とGetYのように、データメンバのゲッターを定義するインタフェースIPointまたは類似のもの(C++では抽象クラスを使用して実行できます)を作成できます。あなたは次のようにあなたの関数を定式化することができます。

float get_2d_noise(const IPoint& p) 
{ 
    return noisemap[p.GetX()][p.GetY()]; 
} 

こうして、ジェネリックスを使用する必要はありません。代わりに、継承を使用します。しかし、get_2s_noiseで使用したいタイプは、IPointから派生しなければなりません(そして、ゲッターを意味のある方法で実装する必要があります)が、あなたが探しているものと思われます。

+0

それは質問に対する答えなので+1です。しかし、私はこれが彼が探しているものだとは思わない。インターフェイスを定義するのはひどい考えです。うまくいけば、当然のことながら、彼の設計では、彼がすでに関数を呼びたいオブジェクトはすべて同じ基本クラスを持っています。 – Bernhard

+0

コメントをいただきありがとうございます。どうしてインターフェースを定義するのがひどいのですか? – Codor

+1

機能を動作させたいクラスを更新する必要があります。 – Bernhard

0

同じ効果を得ることはできますか?つまり、のように、xyのメンバーがあれば動作しますか? (好ましくは実行時ではなくコンパイル時にエラーが発生する)。

これは文字通りテンプレートが存在する点の全体であり、C++の汎用プログラミングをサポートするために作成されたものです。そうではありませんが、テンプレートを書く以外にC++でテンプレートを書く別の方法はありません。

+0

"テンプレートを書く以外の方法でC++でテンプレートを書く方法はありません" - 明らかに真です。無関係です。あなたはただ質問を再構成しただけです。 –

+0

@KarolyHorvathそれは文字通り問題です。 – Barry

+0

他の答えはあなたが間違っていることを証明します。 –

2

明示的templateを使用しないようにするには、(++ 14 C)ジェネリックラムダでカンニングことがあります。

auto get_2d_noise = [&](const auto& p) -> float 
{ 
    return map2D[p.x][p.y]; 
}; 
+1

これは本当に「テンプレートなし」ではありません – Barry

+0

これらはラムダテンプレートです。それらはインスタンス化されるので、まだテンプレートを使用しています:-) –

+0

@Barry:最後に 'template'と同等であるとしても、*キーワード*' template'はありません。 (だから私は「チート」を使うのです)。 – Jarod42

関連する問題