Ограничение диапазона или аналогичной концепции для принятия только определенного типа

#c #templates #c 20 #c -concepts #typename

#c #шаблоны #c 20 #c -концепции #имя типа

Вопрос:

Я хотел бы объявить функцию, подобную следующей:

 string concat(const rangelt;stringgt; autoamp; strings);  

Я добился того же самого с помощью следующего:

 template lt;template lt;typenamegt; typename Tgt; requires rangelt;Tlt;stringgt;gt; string concat(const Tlt;stringgt;amp; strings);  

Но это слишком много и однообразно для меня, чтобы рассматривать возможность использования.

Есть ли более чистый способ?

Я предполагаю, что это не так, поскольку концепция типа требует, чтобы первый параметр шаблона был обычным именем типа, что делает невозможным предоставление ему списка аргументов шаблона.

Если это действительно невозможно, существуют ли какие-либо планы по исправлению этого очевидного недостатка? Если нет, есть ли какие-либо причины, по которым это может оказаться проблематичным для указания/реализации?

Ответ №1:

Может быть, что-то вроде этого:

 template lt;class R, class Tgt; concept range_of = std::ranges::rangelt;Rgt; amp;amp;  std::same_aslt;std::ranges::range_value_tlt;Rgt;, Tgt;;   static_assert(range_oflt;std::vectorlt;intgt;, intgt;);  static_assert(range_oflt;decltype(std::declvallt;std::vectorlt;intgt;amp;gt;() |  std::views::all),  intgt;);