GSL と range-v3 ライブラリに慣れるために、ちょっとした例を試してみましたが、どうすればそれらを連携させることができるのだろうと思いました。私はこのおもちゃの例を持っています
#include <iostream>
#include <range/v3/all.hpp>
using namespace std;
using namespace ranges;
void example_vector(vector<int> const& v)
{
ranges::for_each(view::tail(v), [](int x){
cout << x << ' ';
});
cout << '\n';
}
int main()
{
auto seq = vector<int> { 2,2,2,0,0,2,1,2 };
example_vector(seq);
}
動作します。しかし、範囲として使用しようとするgsl::span<int>
と、エラー メッセージが表示されます。コンパイラはspan
、ビューの概念を満たしていないことを教えてくれます。
#include <gsl.h>
// ...
void example_span(gsl::span<const int> v)
{
ranges::for_each(view::tail(v), [](int x){
cout << x << ' ';
});
cout << '\n';
}
コンパイラ メッセージ:
note: candidate template ignored: disabled by 'enable_if'
[with Rng = gsl::span<const int, -1> &, Rest = <>, _concept_requires_123 = 42]
CONCEPT_REQUIRES_(ViewConcept<Rng, Rest...>())>
しかし、私の理解では、 aspan
は特定のビューであり、 (同じ型の)begin()
およびend()
イテレータさえあるため、そうすべきです。
- それらが構成可能で一緒に動作するのはクールではないでしょうか? それとも、両方に互換性がない理由がありますか?
- これは、range-v3 での強力な「概念」の使用に起因する問題だと思います。他の種類の概念機能が言語でサポートされている場合、自動的に解決されますか?
span
両方のライブラリを(非産業用の)ソフトウェアで一緒に使用したい場合は、現在、何らかの適応が必要であると思います。これらを連携させるには、何を変更すればよいですか? (それがまったく良い考えであれば)- それはまた、最終的に「作業するために満たすべきクラスは何
range-v3
ですか?」という質問に私を導きます。ファサード、アダプターなどからの継承は、現在、これらの概念的な要件についてコンパイラーに伝える唯一の方法ですか?