어떤 방식 으로든 C ++에서 LINQ를 사용하기위한 플랫폼에 구애받지 않는 (CLI가 아님) 움직임이 있습니까?
전 세계 서버 프레임 워크의 상당 부분이 UNIX에서 실행되고 UNIX에서 LINQ for C ++에 액세스하면 많은 사람들이 만족할 것입니다!
어떤 방식 으로든 C ++에서 LINQ를 사용하기위한 플랫폼에 구애받지 않는 (CLI가 아님) 움직임이 있습니까?
전 세계 서버 프레임 워크의 상당 부분이 UNIX에서 실행되고 UNIX에서 LINQ for C ++에 액세스하면 많은 사람들이 만족할 것입니다!
답변:
이것은 템플릿 C ++ LINQ 라이브러리의 솔루션입니다.
소스 코드는 다음과 같습니다. Boolinq
각 기능에 대한 많은 테스트가 있습니다.
지금 작업 중입니다.
다른하실 말씀 있나요?
조언이 될 수 있습니까?
업데이트 : 프로젝트가 https://github.com/k06a/boolinq 로 이동 했으며 이제 소스 코드가 700 줄에 불과한 버전 2.0이 있습니다. :)
Q_FOREACH
. 아마도 Q_FOREACH
단계적으로 중단 되었기 때문일 것입니다.
#define foreach for_each
그런 다음 include : 후에 #undef foreach
Qt 헤더를 포함하십시오.
http://cpplinq.codeplex.com/ 은 아주 좋은 구현입니다.
작성자 :
CppLinq의 동기는 boolinq와 Native-RX가 모두 연산자를 기반으로하는 것 같습니다. " 목록 함수를 작성합니다. 문제는 "." 연산자는 C ++에서 오버로드 될 수 없기 때문에 자체 디자인의 기능으로 이러한 라이브러리를 확장하기가 어렵습니다. 나에게 이것은 중요합니다. CppLinq는 오버로드 가능한 operator >>를 기반으로하므로 CppLinq를 확장 가능하게 만들 수 있습니다.
STL 범위에서 작동하고 많은 LINQ 유사 함수를 제공하는 강력하게 강화 된 라이브러리 인 PSade.Oven을 살펴볼 수 있습니다 .
IEnumerable <> 및 해당 LINQ 연산자를 다시 구현 하는 작은 라이브러리 cppLinq 를 작성했습니다 . 단지 실험 일뿐입니다. 현재로서는 Windows에서만 작동하며 (코 루틴은 Win32 파이버로 구현 됨) VS11의 Dev Preview로만 빌드됩니다 (람다 표현식을 많이 사용합니다 :-)).
다음과 같은 코드를 작성할 수 있습니다.
auto source = IEnumerable<int>::Range(0, 10);
auto it = source->Where([](int val) { return ((val % 2) == 0); })
->Select<double>([](int val) -> double { return (val * val); }));
foreach<double>(it, [](double& val){
printf("%.2f\n", val);
});
shared_ptr
s를 unique_ptr
s로 전환하십시오 . 후자는 전자로 변환 될 수 있지만 그 반대의 경우는 불가능합니다. 또한 스타일, -> double
반환 유형이 필요하지 않습니다 . 암시 적 변환이 제 역할을하도록하세요.
여기에 단순히 boost 및 stl 알고리즘에 대한 래퍼 인 또 다른 대안 이 있으므로 이러한 구현의 대부분의 성능 이점을 얻을 수 있습니다.
다음과 같이 작동합니다.
std::vector<int> xs;
auto count = from(xs)
.select([](int x){return x*x;})
.where([](int x){return x > 16;})
.count();
auto xs2 = from(xs)
.select([](int x){return x*x;})
.to<std::vector<int>>();
일부 메소드는 빈 범위에 대한 프록시를 반환합니다.
std::vector<int> xs;
auto max = from(xs)
.select([](int x){return x*x;})
.where([](int x){return x > 16;})
.max()
.value_or(default_max_value);
피드백을 환영합니다.
실제로 목록 이해를 위해 Linq를 사용하려는 경우이 Linq 라이브러리를 사용할 수 있습니다 . C ++ 11 (MSVC 2010에서 작동)과 Boost가 필요합니다. 라이브러리를 사용하면 다음과 같이 linq 쿼리를 작성할 수 있습니다.
struct student_t
{
std::string last_name;
std::vector<int> scores;
};
std::vector<student_t> students =
{
{"Omelchenko", {97, 72, 81, 60}},
{"O'Donnell", {75, 84, 91, 39}},
{"Mortensen", {88, 94, 65, 85}},
{"Garcia", {97, 89, 85, 82}},
{"Beebe", {35, 72, 91, 70}}
};
auto scores = LINQ(from(student, students)
from(score, student.scores)
where(score > 90)
select(std::make_pair(student.last_name, score)));
for (auto x : scores)
{
printf("%s score: %i\n", x.first.c_str(), x.second);
}
다음을 출력합니다.
Omelchenko score: 97
O'Donnell score: 91
Mortensen score: 94
Garcia score: 97
Beebe score: 91
다음은 C ++ 11 (중국어)을 사용한 C ++-linq 구현입니다.
http://www.cnblogs.com/cbscan/archive/2012/10/20/2732773.html
"지연된 쿼리", "스택 기반"(가능한 한 적은 새 연산자 사용), "시맨틱 복사"(백업 후 쿼리를 여러 번 반복 할 수 있음) 등과 같은 기능을 지원합니다.
또한 "from, select, where, cast, range, all, any, cast, average, contain, count, first, last, head, tail, groupBy, takeUntil, skipUntil, max, min, reduce, 고유, 정렬, 임의, 교차, _union ".
내 코드는 누구나 이해하고 확장 할 수있을만큼 간단하다고 생각합니다.
나는 C ++에 람다 식과 같은 것을 처리 할 수있는 컴파일러 설탕이 없다고 생각한다. 그래서 그런 일은 일어나지 않을 것이다.
from(v).where(&_1 ->* &Person::age >= 18).order_by(Person, age).top(5).order_by(Person, name)
. std :: vector <Person>에서 가장 어린 성인 다섯 명을 선택하고 반환합니다. 알파벳 순서로. 나는 C + +를 ... 작업에 적합 말할 것 그래서
Expression<T>
은 C # 설명서를 참조하십시오.