3

を使用する次のコードがコンパイルされない理由がわかりboost::enable_ifません。typeTにメンバー関数があるかどうかを確認し、helloそうであればそれを呼び出します。

#include <iostream>
#include <boost/utility/enable_if.hpp>
#include <boost/static_assert.hpp>

// Has_hello<T>::value is true if T has a hello function.
template<typename T>
struct has_hello {
  typedef char yes[1];
  typedef char no [2];
  template <typename U> struct type_check;
  template <typename U> static yes &chk(type_check<char[sizeof(&U::hello)]> *);
  template <typename  > static no  &chk(...);
  static const bool value = sizeof(chk<T>(0)) == sizeof(yes);
};

template<typename T>
void doSomething(T const& t,
                 typename boost::enable_if<typename has_hello<T>::value>::type* = 0
                 ) {
  return t.hello();
}

// Would need another doSomething` for types that don't have hello().

struct Foo {
  void hello() const {
    std::cout << "hello" << std::endl;
  }
};

// This check is ok:
BOOST_STATIC_ASSERT(has_hello<Foo>::value);

int main() {
  Foo foo;
  doSomething<Foo>(foo);
}

私は得ています

no matching function for call to ‘doSomething(Foo&)

gcc 4.4.4

静的アサートは問題has_hello<Foo>::valueありませんtrue。私はboost::enable_if間違って使用していますか?

4

3 に答える 3

4

の最初のパラメータは、 という名前の静的定数を含む型でboost::enable_ifなければなりません。必要なのは、非型パラメーターを取るテンプレート (_c サフィックスに注意) です。boolvalueenable_if_cbool

template<typename T>
void doSomething(T const& t,
                 typename boost::enable_if_c<has_hello<T>::value>::type* = 0
                 ) {
  return t.hello();
}

これはコンパイルして正常に実行されます。

また、ブースト ドキュメントのパラグラフ 2 で説明されています。

于 2012-08-19T17:58:10.280 に答える
3

ここ

typename has_hello<T>::value

has_hello<T>::value型名ではありません。値です。


についてはわかりませんbostが、次のように動作します ( gcc 4.7 std=c++0x):

template<typename T>
void doSomething(T const& t,
                 typename std::enable_if<has_hello<T>::value>::type* = 0
                 ) {
  return t.hello();
}
于 2012-08-19T17:55:21.677 に答える
2

今のところ enable_if は使っていませんが、多分

typename boost::enable_if<has_hello<T>>::type* = 0
于 2012-08-19T17:53:49.373 に答える