[英]C++ Only accept a set of types for template parameter pack
要將模板參數包限制為某種類型,可以通過以下方式完成:
std::enable_if_t<std::conjunction_v<std::is_same<int32_t, Ts>...>>
send(bool condition, Ts...);
我實際上會允許 int32_t 和 std::string 以及任何順序。
這怎么表達?
我有一個使用變體的解決方法,但這對我來說看起來不太好:
using allowed_types = std::variant<int32_t, std::string>;
template<typename... Ts>
std::enable_if_t<std::conjunction_v<std::is_assignable<allowed_types, Ts>...>>
send(bool condition, Ts...);
這不會編譯:
std::enable_if_t<std::conjunction_v<std::is_same<int32_t, Ts> || std::is_same<std::string, Ts>...>> // <- does not compile!
send(bool condition, Ts...);
您在std::bool_constant
級別上正確使用std::conjunction
作為&&
的替代品,但是您應該以同樣的方式替換||
與std::disjunction
:
std::enable_if_t<std::conjunction_v<std::disjunction<std::is_same<int32_t, Ts>, std::is_same<std::string, Ts>>...>>
或使用 C++17 您可以在bool
值級別上使用折疊表達式:
std::enable_if_t<((std::is_same_v<int32_t, Ts> || std::is_same_v<std::string, Ts>) && ...)>>
(折疊表達式語法需要外括號。)
當然,在 C++20 的幫助下,這可以做得更好:
template<typename T>
concept Int32OrString = std::same_as<T, int32_t> || std::same_as<T, std::string>;
void send(bool condition, Int32OrString auto...);
甚至
template<typename T, typename... Ts>
concept AnyOf = (std::same_as<T, Ts> || ...);
void send(bool condition, AnyOf<int32_t, std::string> auto...);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.