質問
この記事では、 C#。定義された+演算子を持つ任意の値型の追加を許可します。本質的には、次のコードを許可します。
public T Add(T val1, T val2)
{
return val1 + val2;
}
Tタイプに「+」演算子の定義があるという保証がないため、このコードはコンパイルされませんが、効果は次のようなコードで実現されます。
public T Add(T val1, T val2)
{
//Num<T> defines a '+' operation which returns a value of type T
return (new Num<T>(val1) + new Num<T>(val2));
}
リンクをたどって、Numクラスがこれをどのように達成するかを確認してください。とにかく、質問に。 CまたはC ++で同じ効果を達成する方法はありますか?不思議なことに、私が解決しようとしている問題は、CUDAカーネルがより多くのタイプで動作できるようにすることで、CUDAカーネルの柔軟性と汎用性を高めることです。
更新: .NETの場合、Marc Gravellはユーティリティライブラリ。オペレータの問題を非常にエレガントに解決します。
解決
テンプレートがC ++でコンパイルされる方法により、単純に以下を実行します。
template < class T >
T add(T const & val1, T const & val2)
{
return val1 + val2;
}
は機能しますが、operator +が定義されていないすべてのタイプでコンパイルエラーが発生します。
C ++テンプレートは、すべての型のインスタンス化に対してコードを生成します。したがって、すべての型に対して、正しいことを行うTコードが生成されます。このように、C ++はNum <!> lt; <!> gt;を必要としません。トリック。
プレーンCでは、私の知る限りこれは不可能です。
他のヒント
C ++ではこれは単に問題ではありません。最初のサンプルのようなコードは、文字通りC ++に変換すれば機能します(ETA:Pieterのように)が、どのような状況でも考えられません+を直接使用しても機能しません。存在しない問題の解決策を探しています。
これは、テンプレートを使用してC ++で簡単に実行できます。
template <typename T>
T Add(T val1, T val2)
{
return val1 + val2;
}
ただし、この はヘッダーファイルで定義する必要があり、値ではなくconst参照でパラメーターを渡すこともできます。
これはプレーンCではまったく実行できません。
Cでも実行できますが、マクロを使用して問題の要件を満たしているかどうかはわかりません。
#define ADD(A,B) (A+B)
C ++のテンプレート。 Cでは、大きな手間とオーバーヘッドがないわけではありません。
template<typename T>
T add(T x, T y)
{
return x + y;
}