引数の型に合わせてそれぞれ適切な振る舞いをする関数 – プログラミング – Home

引数の型に合わせてそれぞれ適切な振る舞...
 
通知
すべてクリア

[解決済] 引数の型に合わせてそれぞれ適切な振る舞いをする関数


季節はずれのゴムボート
 季節はずれのゴムボート
(@季節はずれのゴムボート)
ゲスト
結合: 15年前
投稿: 4
Topic starter  

template <class T, size_t N>
size_t GetArraySize(T (&)[N])
{
return N;
}
T[] 形式で表せる、配列の要素数を取得する関数です。この関数を
std::vectorやstd::list の形式の要素数も取得できるようにしたいのですが
どのように書いたらいいのでしょうか?


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

↓こんだけのことですかいのぅ...

#include <iostream>
#include <vector>
#include <list>
#include <deque>
#include <set>

template <class T, size_t N> inline
size_t GetArraySize(T (&)[N])
{ return N; }

template <class Container> inline
size_t GetArraySize(const Container& c)
{ return c.size(); }

int main() {
int a[] = { 1, 2, 3, 4, 5, 6, 7 };
std::vector<int> v(a,a+6);
std::list<int> l(a,a+5);
std::deque<int> d(a,a+4);
std::set<int> s(a,a+3);
std::cout << GetArraySize(a) << std::endl;
std::cout << GetArraySize(v) << std::endl;
std::cout << GetArraySize(l) << std::endl;
std::cout << GetArraySize(d) << std::endl;
std::cout << GetArraySize(s) << std::endl;
}


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

多重定義すればいいと思うぞ (特殊化では不可能なので)

vector ならまだしも list の size を取ることに実用的意味があるか?と問うてみる。
俺ならやらない。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

もうひとつの解法: T[] なんか捨てちまえ。
代わりに array<T,N> 使う。
そうすればどんなコンテナでも size() でおっけぃ。

// VC++ 2008 (VC9)

#include <iostream>
#include <array>
#include <vector>
#include <list>
#include <deque>
#include <set>

namespace std { using namespace std::tr1; }

int main() {
std::array<int,7> a = {{ 1, 2, 3, 4, 5, 6, 7 }};
std::vector<int> v(a.begin(),a.begin()+6);
std::list<int> l(a.begin(),a.begin()+5);
std::deque<int> d(a.begin(),a.begin()+4);
std::set<int> s(a.begin(),a.begin()+3);
std::cout << a.size() << std::endl;
std::cout << v.size() << std::endl;
std::cout << l.size() << std::endl;
std::cout << d.size() << std::endl;
std::cout << s.size() << std::endl;
}


返信引用
季節はずれのゴムボート
 季節はずれのゴムボート
(@季節はずれのゴムボート)
ゲスト
結合: 15年前
投稿: 4
Topic starter  

tetrapod さん、επιστημη さん、ありがとうございました。
もう一点質問させてください。
επιστημη さんの書かれた、「C++ テンプレートテクニック」の見よう見まねで勉強して
いるのですが、思い通りにならなくて困っています。

template<class Iterator_First, class Iterator_Second, int N>
void Deviation<Iterator_First, Iterator_Second, N>::
Diff(std::pair<Iterator_First, Iterator_First> iter_pair_first,
std::pair<Iterator_Second, Iterator_Second> iter_pair_second, int N )
この関数を
T[]型に対応させるため、iterator_traits を使って書く方法を教えたいただけないで
しょうか。

#include <iostream>
#include <vector>
#include <iterator>
#include <utility>

template<class Iterator_First, class Iterator_Second, int N>
class Deviation {
private:
int deviation_;
public:
Deviation() : deviation_(0){}
void Diff(std::pair<Iterator_First, Iterator_First> iter_pair_first,
std::pair<Iterator_Second, Iterator_Second> iter_pair_second, int N = 10);
};

template<class Iterator_First, class Iterator_Second, int N>
void Deviation<Iterator_First, Iterator_Second, N>::
Diff(std::pair<Iterator_First, Iterator_First> iter_pair_first,
std::pair<Iterator_Second, Iterator_Second> iter_pair_second, int N )
{

while(iter_pair_first.first != iter_pair_first.second)
{
deviation_ = *iter_pair_first.first - *iter_pair_second.first;
std::cout << deviation_ << \n;
++iter_pair_first.first;
++iter_pair_second.first;
}
}
using namespace std;

int main()
{
vector<int> v_first; vector<int> v_second;

v_first.push_back(1); v_second.push_back(2);
v_first.push_back(2); v_second.push_back(4);
v_first.push_back(3); v_second.push_back(1);
v_first.push_back(4); v_second.push_back(3);
v_first.push_back(5); v_second.push_back(7);
v_first.push_back(6); v_second.push_back(6);
v_first.push_back(7); v_second.push_back(5);
v_first.push_back(8); v_second.push_back(10);
v_first.push_back(9); v_second.push_back(8);
v_first.push_back(10); v_second.push_back(9);

int deviation = 0;
int array_size_first;
int array_size_second;

Deviation<vector<int>::iterator, vector<int>::iterator, 10> dev;
dev.Diff(make_pair(v_first.begin(), v_first.end()), make_pair(v_second.begin(),
v_second.end()), 10);

int array_1st[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int array_2nd[] = {2, 4, 1, 3, 7, 6, 5, 10, 8, 9};
// この型変換の方法がわかりません
// dev.Diff(make_pair(array_1st, array_1st+10), make_pair(array_2nd,
array_2nd+10), 10);

cout << deviation << \n;

return 0;
}


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

↓よぉわからんが。

int array_1st[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int array_2nd[] = {2, 4, 1, 3, 7, 6, 5, 10, 8, 9};
Deviation<int*,int*,10> adev;
adev.Diff(make_pair(array_1st, array_1st+10), make_pair
(array_2nd,array_2nd+10), 10);


返信引用
季節はずれのゴムボート
 季節はずれのゴムボート
(@季節はずれのゴムボート)
ゲスト
結合: 15年前
投稿: 4
Topic starter  

επιστημη さん、お世話になります。
make_pair で型を指定すればできたんですね。
そっちでしたか・・・
勉強になりました、ありがとうございました。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

> make_pair で型を指定すればできたんですね。

ハァ?


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました