0

私は現在、次のようなものを持っています:

template<typename T>
typename std::enable_if<!std::is_pointer<T>::value,void>::type
f( T const &t ) {
  // ...
}

つまり、 がポインター型であるfと見なされたくありません。Tこれはそのままで問題なく動作します。fただし、引数が値によって返される値であるか、参照によって返される値であるかに基づいて、2つの異なるバージョンが必要です。

std::string const& ret_by_ref();
std::string ret_by_val();

f( ret_by_ref() ); // I want the existing function to be called here
f( ret_by_val() ); // I want a new template specialization of f() called here

上記のように呼び出されるように、既存の宣言を拡張して新しい宣言をf作成するにはどうすればよいですか?f

C++-11より前の回答をいただければ幸いです。

4

2 に答える 2

0

これは、右辺値参照を使用して簡単に実行できます。追加するだけ

template<typename T>
typename std::enable_if<!std::is_pointer<T>::value,void>::type
f( T &&t ) {
    // ...
}
于 2012-10-19T04:20:07.210 に答える
-1

11より前のコンパイラの場合、ブースト型特性libをいつでも参照できます。

boost :: is_pointer

http://www.boost.org/doc/libs/1_43_0/libs/type_traits/doc/html/boost_typetraits/reference/is_pointer.html

タイプ特性の「背景とチュートリアル」については、ここから読み始めることをお勧めします。

于 2012-10-19T11:24:34.900 に答える