7

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ですか?」という質問に私を導きます。ファサード、アダプターなどからの継承は、現在、これらの概念的な要件についてコンパイラーに伝える唯一の方法ですか?
4

1 に答える 1

9

range-v3のView概念 (さらに言えば、範囲 TS) では、概念(およびイテレータ範囲を区切る) と概念Rの両方を満たすタイプが必要です。デフォルトの構築可能。a のイテレータとセンチネルの型(whatとreturn) も(他の要件の中で) なければなりません。Rangebegin(r)end(r)SemiregularRRangebeginendSemiregular

場合によっては s がデフォルトで構築可能でなく、それらの反復子がデフォルトで構築可能ではないため、ファミリは概念spanを満たしません。標準 C++ でさえ Forward イテレータのデフォルトの構築を必要とするため、現在のイテレータは Ranges TS、range-v3、または標準 C++ のいずれにも準拠していません。Viewspanspan

とはいえ、これらすべての一連の要件を満たすために必要な変更は最小限で簡単です

20161207 更新:

range-v3 には/の概念spanを適切にモデル化する の実装が含まれるようになりました。ViewRange

20170128 更新:

gsl::spanデフォルトの構築可能な反復子を持つようになりました。その結果、スパンは range-v3 で使用できるようになりました。動的な範囲を持つスパン (例: ) は&の概念をgsl::span<int>モデル化し、静的な範囲を持つスパン (例: ) はモデルのみをモデル化します。RangeViewgsl::span<int, 42>RangeView

于 2016-03-29T07:25:52.277 に答える