簡體   English   中英

混合模板類型的模板參數包(帶有可選參數的std :: function重新創建)

[英]Template parameter pack of mixed templated types (std::function recreation with optional arguments)

我試圖做一個std :: function替代品,它支持帶有默認值的可選參數。 我嘗試了一些不同的語法思想,但最現實的似乎是保存自變量數據的專用模板的參數包。 這是我想要的外部語法:

Function<
    void /*Return type*/,
    Arg<false, int> /*Required int parameter*/,
    Arg<true, bool, true> /*Optional bool parameter that defaults to true*/
> func;

我本來希望保留Function<ReturnType(args)>語法,但是看來您只能在括號中放入類型名稱,而不能在類中放入。 這是我當前的代碼:

template<bool Optional, typename Type, Type Default>
class Arg;

template<typename Type, Type Default>
class Arg<false, Type, Default> {};

template<typename Type, Type Default>
class Arg<true, Type, Default> {};

問題1:我不能找到一種方法,使“默認”參數非必需的false專業化。 我嘗試了使用默認構造函數的代理類,將第三個參數更改為指針,並指定了nullptr(在語法上並不理想),以及對類型的const引用(從用戶端仍然需要三個參數)但是似乎沒有什么允許使用Function<false, Type>接受兩個參數。

問題2:我找不到正確的語法來獲取混合模板參數類型的參數包。 我已經嘗試過(語法明顯無效)

template<typename RetType, Arg<bool, typename Type, Type>... args>
class Function{};

甚至是雙重/嵌套模板,但我也無法做到這一點。

所有這些間接性實際上源於您在類模板中不能包含多個參數包的事實,因此我必須找到創造性的方法來指定可選參數,但是我將采取任何解決方案,以某種方式在編譯時使此函數成為可能。時間,而不必動態構造這些功能。

我正在使用C ++ 20。

要使第三個模板參數在第一個參數為false時是可選的,可以將默認參數與std::enable_if

template <bool Optional, typename T,
    T Default = std::enable_if_t<!Optional, T>{}>
class Arg;

這樣, Arg<false, int>等效於Arg<false, int, 0> ,而Arg<true, int>格式錯誤。


您可以使用通用參數:

template <typename R, typename... Args>
class Function {
    static_assert(std::conjunction_v<is_arg_v<Args>...>);
};

其中is_arg可以像

template <typename T>
struct is_arg :std::false_type {};
template <bool Optional, typename T, T Default>
struct is_arg<Arg<Optional, T, Default>> :std::true_type {};
template <typename T>
inline constexpr bool is_arg_v = is_arg<T>::value;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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