ページ 11

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

Posted: 2021年9月20日(月) 22:43
by 焼肉
以下のサイトを参考に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;});
}

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

Posted: 2021年9月21日(火) 03:49
by みけCAT
ジェネリック型についてはよくわからないですが、とりあえずコンパイルが通るようにしてみました。

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

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

Posted: 2021年9月21日(火) 06:15
by 焼肉(解決済み)
ありがとうございます。
非常に助かりました!