我有這樣一組玩具功能:
template <typename... Args>
requires std::conjunction_v<std::is_convertible<Args, int>...>
void test(Args...) { std::cout << "int"; }
template <typename... Args>
requires std::conjunction_v<
std::disjunction<std::is_convertible<Args, int>,
std::is_convertible<Args, std::string>>...> &&
std::disjunction_v<std::is_convertible<Args, std::string>...>
void test(Args...) { std::cout << "istring"; }
當我使用了全部轉換為int和不可轉換到的std :: string,喜歡爭執的第一個函式將被呼叫:test(1, 2L, 3.0, 4UL)。
如果至少有一個引數可以轉換為 std::string 并且所有引數都可以轉換為 int 或 std::string,則將呼叫第二個函式,例如test(1, 2L, "Hello", 4UL).
它正如我所料。
但是,當我將第二個函式編碼為以下兩種樣式時,它不起作用。引數的概念被一個接著一個檢查,而1, 2L, 4UL不是一個Istring.
template <typename... Args>
concept Istring = std::conjunction_v<
std::disjunction<std::is_convertible<Args, int>,
std::is_convertible<Args, std::string>>...> &&
std::disjunction_v<std::is_convertible<Args, std::string>...>;
void test(Istring auto...) { std::cout << "istring"; }
template <typename... Args>
concept Istring = std::conjunction_v<
std::disjunction<std::is_convertible<Args, int>,
std::is_convertible<Args, std::string>>...> &&
std::disjunction_v<std::is_convertible<Args, std::string>...>;
template <IString... Args>
void test(Args...) { std::cout << "istring"; }
我想知道是否有辦法提取這個概念。
uj5u.com熱心網友回復:
在這種情況下沒有必要使用std::conjunctionand std::disjunction,因為它會使代碼冗長且難以閱讀。使用折疊運算式會更直觀。
template <typename... Args>
requires (std::is_convertible_v<Args, int> && ...)
void test(Args...) { std::cout << "int\n"; }
template <typename... Args>
concept Istring =
((std::is_convertible_v<Args, int> ||
std::is_convertible_v<Args, std::string>) && ...) &&
(std::is_convertible_v<Args, std::string> || ... );
template <Istring... Args>
void test(Args...) { std::cout << "istring\n"; }
在上面的例子中,Istring只會約束單個引數而不是引數包,即檢查每個引數是否滿足以下退化約束:
template <typename T>
concept Istring =
(std::is_convertible_v<T, int> || std::is_convertible_v<T, std::string>) &&
std::is_convertible_v<T, std::string>;
您應該使用該requires子句來檢查所有引數,例如:
template <typename... Args>
requires Istring<Args...>
void test(Args...) { std::cout << "istring\n"; }
演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/361049.html
