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