簡體   English   中英

C++ 模板參數包只接受一組類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM