2

push()次のように使用する「安全な」関数を宣言したいauto_ptr

template<class StackType,typename T>
inline void push( StackType &s, auto_ptr<T> p ) {
  s.push( p.get() );
  p.release();
}

また、null ポインターに対しても機能するようにします。たとえば、次のようになります。

push( my_stack, 0 ); // push a null pointer

したがって、専門化:

template<class StackType>
inline void push( StackType &s, int p ) {
  s.push( reinterpret_cast<typename StackType::value_type>( p ) );
} 

動作しますが、醜く、次のような誤ったコードを許可します。

push( my_stack, 1 ); // ???

コンパイルする。

有効な値 (null ポインターの場合)としてpush()のみ受け入れるような特殊化を作成するにはどうすればよいですか?0int

要件

  • StackTypeは、使用する必要があり、ソース コードを変更できないスタックのようなコンテナー クラスです(のようにstd::stack)。push()メンバー関数があると仮定できます。

  • nullptrC++0x コンパイラを要求できないため、使用できません。

4

3 に答える 3

3

次のように関数をオーバーロードできます。

template<class StackType,typename T>
inline void push( StackType &s, auto_ptr<T> p ) {
  s.push( p.get() );
  p.release();
}

template<class StackType>
inline void push( StackType &s )
{
  s.push( reinterpret_cast<typename StackType::value_type>( 0 ) );
}

それを使用します:

push( my_stack );
push( my_stack, auto_ptr_var );
于 2011-05-17T19:40:55.227 に答える
1

編集: 2 回目の反復。(最初は、push特定のスタック クラスのメソッドがオーバーロードされることを前提としていました。)

この繰り返しでは、代わりにpush、格納できるプッシュ メンバーを提供する任意のクラスの関数テンプレートとして提供しようとしますT*。その意図は、引数としてauto_ptr<T>とを許可することです0が、他の整数値とポインターを許可しないことです。

基本的なトリックは同じです。メンバーへの null ポインターとしてpush(s, 0)実際に解釈されるようなオーバーロードを提供します。0

class X;

template<typename StackType, typename T>
void push(StackType& s, std::auto_ptr<T> p);

template<typename ST>
void push(ST&, int (X::*));

class X {
  private:
    int m;
    X(); // unimplemented
    X(const X&); // unimplemented
    X& operator=(const X&); // unimplemented
    ~X(); // unimplemented

   template<typename ST>
   friend
   void push(ST&, int (X::*));
};

template<typename StackType, typename T>
void push(StackType& s, std::auto_ptr<T> p) {
    s.push(p.get());
    p.release();
}

template<typename StackType>
void push(StackType& s, int (X::*)) {
    s.push(0);
}

テスト:

std::stack<int*> s;
push(s, std::auto_ptr(new int(1))); // works
push(s, 0);  // works
push(s, 1);  // errors out: no matching function
于 2011-05-17T20:54:13.630 に答える
0

このケースを処理するには、特定のヌル ポインター型が必要です。これが、C++11 が を導入する理由ですnullptr

于 2011-05-17T19:42:15.220 に答える