ジェネリック型を使ったFilter関数の使い方がわかりません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
焼肉

ジェネリック型を使ったFilter関数の使い方がわかりません

#1

投稿記事 by 焼肉 » 2年前

以下のサイトを参考にFilter関数(Vectorや配列の要素を判定し新しいVectorもしくは配列を作成する)を使用しようと思ったのですが、ジェネリック型を使ったFilter関数の使い方がわかりません。
どのように使用すれば良いでしょうか?

ttps://pgon.dev/blog/posts/building-map-filter-and-reduce-in-c-with-templates-and-iterators/

コード:

#include <vector>

template <typename IteratorType>
using ItemType = typename std::iterator_traits<typename IteratorType::iterator>::value_type;

template <typename IteratorType>
IteratorType Filter(IteratorType &items, std::function<bool(ItemType<IteratorType> &item)> filterCb)
{
    IteratorType filteredIterator;
    ForEach<IteratorType>(items, [&filteredIterator, &filterCb](auto &item) { if (filterCb(item)) filteredIterator.push_back(item); });
    return filteredIterator;
}
class HogeTest {
	HogeTest(int id){this->id = id}
	~HogeTest(){}
	int id;
};
void main() {
	std::vector<HogeTest> vec;
 	vec.push_back(HogeTest(3));
	vec.push_back(HogeTest(4));
 	vec.push_back(HogeTest(5));
    	vec.push_back(HogeTest(6));
    	
    	// エラー。記述が正しくないです
    	Filter(&vec, [](HogeTest &item){return item.hoge > 0;});
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: ジェネリック型を使ったFilter関数の使い方がわかりません

#2

投稿記事 by みけCAT » 2年前

ジェネリック型についてはよくわからないですが、とりあえずコンパイルが通るようにしてみました。

std::functionを使うため、ヘッダ functional を include する
・HogeTest のコンストラクタ内の文の最後にセミコロンを補う
・HogeTest のコンストラクタとデストラクタをpublicにする
・HogeTest にメンバ hoge が無いため、追加する
・main関数の返り値の型をvoidではなくintにする
・Filter 関数に渡す第一引数をstd::vectorへのポインタではなくstd::vectorにする
・ForEach が定義されていないので、適当に定義する

コード:

#include <vector>
#include <functional>

template <typename a>
void ForEach(const a&, ...) {}

template <typename IteratorType>
using ItemType = typename std::iterator_traits<typename IteratorType::iterator>::value_type;

template <typename IteratorType>
IteratorType Filter(IteratorType &items, std::function<bool(ItemType<IteratorType> &item)> filterCb)
{
	IteratorType filteredIterator;
	ForEach<IteratorType>(items, [&filteredIterator, &filterCb](auto &item) { if (filterCb(item)) filteredIterator.push_back(item); });
	return filteredIterator;
}
class HogeTest {
public:
	HogeTest(int id){this->id = id;}
	~HogeTest(){}
	int hoge = 42;
private:
	int id;
};
int main() {
	std::vector<HogeTest> vec;
	vec.push_back(HogeTest(3));
	vec.push_back(HogeTest(4));
	vec.push_back(HogeTest(5));
	vec.push_back(HogeTest(6));

	// エラー。記述が正しくないです
	Filter(vec, [](HogeTest &item){return item.hoge > 0;});
}
これでC++14としてコンパイルが通りました。
https://wandbox.org/permlink/82YRtjjJm8T82cT2
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

焼肉(解決済み)

Re: ジェネリック型を使ったFilter関数の使い方がわかりません

#3

投稿記事 by 焼肉(解決済み) » 2年前

ありがとうございます。
非常に助かりました!

返信

“C言語何でも質問掲示板” へ戻る