OTL針對oracle、odbc分別有一套庫,包括各自的otl_connect,otl_stream等。二者通過命名空間加以區別。但是,設想我們有一個類,這個類可能使用oracle,也可能使用odbc;那麼我們勢必要為它寫N個模板參數。我們可以用C++ Traits的方法來解決這一問題。
template<typename C, typename S, typename R, typename I>
struct COTLTraits
...{
typedef C otl_connect;
typedef S otl_stream;
typedef R otl_refcur_stream;
typedef I otl_stream_read_iterator;
};
typedef otl_stream_read_iterator< oracle::otl_stream,
oracle::otl_exception,
oracle::otl_lob_stream> oracle_stream_read_iterator;
typedef otl_stream_read_iterator< odbc::otl_stream,
odbc::otl_exception,
odbc::otl_lob_stream> odbc_stream_read_iterator;
typedef COTLTraits< oracle::otl_connect,
oracle::otl_stream,
oracle::otl_refcur_stream,
oracle_stream_read_iterator> COracleTraits;
typedef COTLTraits< odbc::otl_connect,
odbc::otl_stream,
void,
odbc_stream_read_iterator> COdbcTraits;
實際應用的時候,我們直接使用COracleTraits和COdbcTraits兩個類,就可以訪問兩套資料庫提供者。