9

これがコンパイルされるのはなぜですか:

class Testable {
public:
    template <bool flag>
    typename std::enable_if<flag>::type
    void foo() { cout << "Yay" << endl; }

    template <bool flag>
    typename std::enable_if<!flag>::type
    void foo() { cout << "Nay" << endl; }
};

ただし、次のようにデフォルトの型を使用して両方の foo を定義した場合はそうではありません。

    template <bool flag, typename = typename std::enable_if<flag>::type>
    void foo() { cout << "Yay" << endl; } // (A)

    template <bool flag, typename = typename std::enable_if<!flag>::type>
    void foo() { cout << "Nay" << endl; } // (B)

このエラーが発生します (最初の行は の定義を(B)指し、2 番目の行は を指しています(A)):

error: 'template<bool flag, class> void Testable::foo()' cannot be overloaded
error: with 'template<bool flag, class>> void Testable::foo()'
4

2 に答える 2

0

前述のように、2 つの関数が同じ署名を持つことはできません。

ただし、別の修正があります。

template<std::size_t>
struct secret_enum { enum class type {}; };
template<bool b, std::size_t n=0>
using EnableIf = typename std::enable_if< b, typename secret_enum<n>::type >::type;

class Testable {
public:
  template <bool flag, EnableIf<flag, 0>...>
  void foo() { cout << "Yay" << endl; } // (A)

  template <bool flag, EnableIf<!flag, 1>...>
  void foo() { cout << "Nay" << endl; } // (B)
};

0、などでオーバーロードを列挙すると1、可能なタイプが生成されます。...これにより、「これらのうちの 0 個以上」と言うことができ、生成されたタイプは基本的にenumインスタンスを生成できません。

残念ながら、これは clang 3.2 では機能しません。gcc 4.8で行います。

于 2013-04-27T00:15:24.983 に答える