我想寫一個程式,只對std::vector或std::list中的數字進行排序。 為此,我做了2個概念:
template<typename T>
concept ValidContainer = requires(T a) {
std::same_as<T, std::vector<typename T::value_type>> 。
std::same_as<T, std::list<typenameT::value_type>>。
};
還有:
template<typename T>
concept Sortable = requires(T a) {
ValidContainer<T> && std::same_as<typename T::value_type, int>。
ValidContainer<T> && std::same_as<typename T::value_type, float>;
};
以及對它們進行排序的函式的簽名:
void BubbleSort(Sortable auto& 集合)
{
//sort algorithm
我腦子里出現的問題是,當我傳遞一個std::vector<std::string>時,并沒有顯示出編譯錯誤?
int main()
{
std:: vector<int> test = { 32, 3, 6, 8, 2, 5, 0, 43, 67, 1 };
std::vector<std::string> test2 = { "第一", "第二", "第三" };
BubbleSort(test); //this is ok。
BubbleSort(test2); //這不應該是一個編譯錯誤嗎?。
return 0;
}
uj5u.com熱心網友回復:
這一點:
template<typename T>
concept ValidContainer = requires(T a) {
std::same_as<T, std::vector<typename T::value_type>> 。
std::same_as<T, std::list<typenameT::value_type>>。
};
正在檢查運算式 std::same_as<T, std::vector<typename T::value_type>>;是否有效,而不是說它也是真。也就是說,它基本上只是檢查typename T::value_type是一個東西。
在這種形式下,如果你想require什么,你必須使用requires:
template<typename T>
concept ValidContainer = requires(T a) {
requires std::same_as<T, std::vector<typename T::value_type> >。
requires std::same_as<T, std::list<typename T::value_type>> 。
};
盡管現在我們要求T既是一個向量又是一個串列,所以這永遠不會成為現實。所以我們真的需要:
template <typename T>
concept ValidContainer =
std::same_as<T, std::vector<typename T::value_type> >
|| std::same_as<T, std::list<typename T::value_type>>。
雖然即使這樣也不是很好,因為現在我們拒絕了std::vector<T, MyAlloc>。
這與為什么這是你的約束問題是分開的 - 為什么你只能對
vector和list進行排序...而不是像deque或string或span或...? 或者為什么你只限于int和float?
你可以冒泡排序任何可排序的前向范圍。我將其表達為:
template <std::range::forward_range R>
requires std::totally_ordered<std::ranges::range_reference_t<R> >
void BubbleSort(R& r)。
uj5u.com熱心網友回復:
requires運算式是true,如果被包圍的運算式是well-formed。 如果運算式本身評估為true,這并不重要。
(事實上,requires-expression中的運算式從未被評估過)
你似乎沒有解決一個測驗運算式是否符合格式的問題。 你的概念應該是這樣的:
template<typename T>
concept ValidContainer =
std::same_as<T, std::vector<typename T::value_type>> ||
std::same_as<T, std::list<typenameT::value_type>>。
template<typename T>
concept Sortable =
( ValidContainer<T> && std::same_as<typename T::value_type, int> ) ||
( ValidContainer<T>&&std::same_as<typename T::value_type, float>) 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/316140.html
標籤:
