2

関数bar()をサポートするライブラリを提供しています。スカラー値(double、intなど)を渡したときの動作は、スカラー値ではないもの(予想されるすべての場合、ユーザー定義型)を渡した場合の動作とは異なります。だから私はこのようなコードを書きました:

#include <iostream>

class Foo
{
public:
   template <class T> void bar(T const &rhs) { std::cout << "T" << std::endl; }
   void bar(double rhs) { std::cout << "double" << std::endl; }
};

int main()
{
   Foo foo;
   foo.bar(4);
}

これに関する問題は、main()の2行目にあります。このコードの結果は「T」の出力です。コンパイラーはbar(double)の呼び出しよりもテンプレートを優先します。これは、パラメーターがintであり、int const&にキャストするためであると想定しています(const&はr値を参照できるため)。

私の質問は、「明示的に呼び出すことなく、すべてのスカラー値をサポートできる方法はありますか?」です。私は本当にすべての可能なタイプを呼びたくありません、なぜなら...まあ...それらはたくさんあるからです。charからlonglongまですべてをカバーし、揮発性とunsignedのすべての組み合わせを含める必要があります。

4を4.0に変更するだけで機能することは知っていますが、これはライブラリへのパブリックインターフェイス用であり、ユーザーが4.0代わりに入力する必要があるの4は汚いだけです。

4

1 に答える 1

4

はい、特徴があります:

#include <type_traits>
#include <iostream>

class Foo
{
public:
   template <class T>
   typename std::enable_if<!std::is_scalar<T>::value, void>::type bar(T const & rhs)
   {
      std::cout << "T" << std::endl;
   }

   void bar(double rhs)
   {
      std::cout << "double" << std::endl;
   }
};

型には、スカラー、関数、配列、クラス、共用体、および参照の 6 つの基本カテゴリがあります。そしてvoid。それぞれに対応する特徴があります。詳しくはこちらをご覧ください。

于 2012-10-29T22:32:25.640 に答える