数値の配列を表すテンプレートクラスがあります。
このクラスは、任意のタイプの数値(int、doubleなど)と3つのタイプのコンテナー(std :: vector、std :: deque、およびstd :: list)で機能するようにします。
これが私の特定の問題に関連する実装のビットです:
template < typename Numeric_t, typename Container = std::vector<Numeric_t> >
class Array {
// field member
Container m_data;
// other stuff here
// ...
// random element access for std::vector and std::deque
Numeric_t & operator[] (unsigned int index) { return m_data[index]; }
// random element access for std::list
Numeric_t & operator [] (unsigned int index) {
std::list<Numeric_t> :: iterator it = m_data.begin();
std::advance(it, index);
return *it;
}
}
もちろん、コンパイラーでは、演算子[]をオーバーロードすることはできません。
私が必要とするのは、 std :: listに固有の演算子[]の一種の部分的な特殊化ですが、C++でも部分的なテンプレート関数の特殊化は許可されていません。
(ランダム要素アクセスはリストにとって効率的ではないことを私は知っていますが、それはここでのポイントではありません)。
理想的には、クライアントコードで次のようにArrayクラスを使用したいと思います。
Array < int, std::vector<int> > vec;
Array < int, std::list<int> > lst;
// fill arrays here
// ...
std::cout << vec[0] << std::endl;
std::cout << lst[0] << std::endl;
多くの調査の後、私は実用的な解決策を見つけることができませんでした。
この問題を解決するための最もエレガントな方法は何でしょうか?
ご協力いただきありがとうございます。