5

この記事では、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 カーネルをより柔軟/一般的にできるようにすることです。

更新: .NET については、Marc Gravell が、演算子の問題を非常にエレガントに解決するユーティリティ ライブラリを作成しました。

4

5 に答える 5

13

テンプレートが C++ でコンパイルされる方法により、次のようにするだけです。

template < class T >
T add(T const & val1, T const & val2)
{
    return val1 + val2;
}

operator+ が定義されていないすべての型でコンパイル エラーが発生します。

C++ テンプレートは、すべての型のインスタンス化に対してコードを生成するため、すべての型に対して正しいことを行う T コードが生成されます。このように、C++ は Num<> トリックを必要としません。

普通の C では、私の知る限り、これは不可能です。

于 2008-10-21T13:54:52.847 に答える
4

C++ では、これは単に問題ではありません。最初のサンプルのコードは、文字通り C++ に変換された場合 (ETA: Pieter が行ったように) 機能しますが、+ を直接使用すると機能しない状況は考えられません。存在しない問題の解決策を探しています。

于 2008-10-21T13:56:42.110 に答える
1

これは、テンプレートを使用して C++ で簡単に実行できます。


template <typename T>
T Add(T val1, T val2)
{
  return val1 + val2;
}

ただし、これはヘッダー ファイルで定義する必要があることに注意してください。また、値ではなく const 参照によってパラメーターを渡したい場合もあります。

これはプレーンな C ではまったく実行できません。

于 2008-10-21T13:55:05.093 に答える
1

Cでも同様に実行できますが、マクロを使用して問題の要件を満たしているかどうかはわかりません。

#define ADD(A,B) (A+B)
于 2008-10-21T14:06:25.913 に答える
0

C++ のテンプレート。C では、大規模な手間とオーバーヘッドがないわけではありません。

template<typename T> 
T add(T x, T y)
{ 
    return x + y;
}
于 2008-10-21T13:56:42.127 に答える