私はoperator<<
自分のバージョンに置き換えたい欠陥のあるライブラリを使用しています。これは、ADL がライブラリの名前空間の引数のメンバーシップに基づいてオーバーロードを選択するイディオムに従います。operator<<
代わりにC++ に自分自身を選択させる方法はありますか?
質問する
239 次
1 に答える
1
最適ではない解決策の 1 つは、ライブラリ型の周りにラッパー クラスを宣言することです。
一般的な実装は次のようになります。
/* Namespace-specific reference wrapper type.
Associates a function argument with the desired namespace.
Declare a new use_local_t for each namespace with an overriding overload */
template< typename t >
struct use_local_t
{ t ref; };
template< typename t >
use_local_t< t && >
use_local( t &&o )
{ return { std::forward< t >( o ) }; }
/* The overriding overload.
Instead of overloading on a specialization of use_local_t, use the
general template and enable_if. This allows for the various kinds of
references that use_local_t might forward, and conversion of the function
argument to the expected library_type parameter. */
template< typename t >
inline
typename std::enable_if<
std::is_convertible< t, library_type const & >::value,
std::ostream &
>::type
operator<< ( std::ostream &s, use_local_t< t > ul ) {
return s << ul.ref.foo;
}
std::cout << my_namespace::use_local( library_obj );
これは、式テンプレートで動作することがテストされています。オーバーライド オーバーロードが一致しない場合、GCC 4.7 からのエラー メッセージは危険であることに注意してください。これはstd::
、ストリームの右辺値参照を含むオーバーロードを指します。
/opt/local/include/gcc47/c++/ostream:600:5: エラー: 'std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits> の引数 1 を初期化しています&&, const _Tp&)
于 2012-11-12T08:15:54.337 に答える