1

テンプレートパラメータが特定の条件を満たす場合にのみ特定のメンバー関数が意味を持つテンプレートクラスがあります。たとえば、std::enable_if<>を使用すると、これらの場合にのみ定義できますが、条件付きで呼び出すにはどうすればよいですか?これが簡単な例です

template<class T> class A
{
   typename std::enable_if<std::is_floating_point<T>::value>::type a_member();
   void another_member()
   {
     a_member(); // how to restrict this to allowed cases only?
   }
};
4

2 に答える 2

9

まず、そのようにSFINAEを使用することはできません。テンプレートタイプパラメーターは、クラスではなく関数上にある必要があります。

完全なソリューションは次のようになります。

template<class T> class A
{
private:
   template <class S>
   typename std::enable_if<std::is_floating_point<S>::value>::type a_member() {
       std::cout << "Doing something";
   }

   template <class S>
   typename std::enable_if<!std::is_floating_point<S>::value>::type a_member() {
       //doing nothing
   }

public:
   void another_member()
   {
     a_member<T>();
   }
};


int main() {
    A<int> AInt;
    AInt.another_member();//doesn't print anything

    A<float> AFloat;
    AFloat.another_member();//prints "Doing something"
}
于 2012-07-06T14:19:36.110 に答える
1

警告:これは私が試したことがない完全でひどいハックであり、決して機能しない可能性があります。

これをクラス宣言に追加してみてください。

typename std::enable_if<std::is_floating_point<T>, int*>::type a_enabled_p() { return 0;};
void another()
{
  if((a_enabled_p()+1)==1)
  {
    //Not enabled
  }
  else if((a_enabled_p()+1)==sizeof(int))
  {
    //Is enabled
  }
}

これが、このホラーが機能する理由です。それらが浮動小数点の場合、述部の戻り値はint*。です。もしそうなら、typedefはなく、デフォルトでint(私は願っています)になります。に1を追加するとint*、実際には。が追加されsizeof(int)ます。intに1を追加すると、1ずつ増加します。つまり、1を追加することの価値をチェックすることで、私たちは知っています。

注:これは使用しないでください。思いつくのは楽しかったですが、上記の答えはたくさんです

多くの

より良い。これは使用しないでください。お願いします。

于 2012-07-06T14:23:16.477 に答える