我有一個模板功能:
template <??? func>
??? wrapper(??? args) {
// ... Stuff
return func(args);
}
func它應該與非型別模板引數具有相同的簽名。
我得到的最接近的是auto在模板宣告中使用,然后使用某種形式的函式特征來推斷回傳型別,但是,這種方法不允許作為一個整體推斷引數。
理想情況下,
template <typename R, typename... Args, R(*func)(Args...)>
R wrapper(Args&&... args); // ...
或其他一些虛構的語法將 A. 被允許和 B. 推斷R和Args從func.
func 必須在編譯時指定,并且該函式可能沒有任何附加引數(我需要獲取包裝器的地址)。
在這一點上,我覺得我目前的解決方案,
template <auto func, typename... Args>
auto wrapper(Args&&... args) {
return func(std::forward<Args>(args)...);
}
無法改進,因為似乎不可能生成“純”可變引數模板引數(在將它們“存盤”到任何地方(例如 a tuple)之后將它們取回)。這很可悲,因為它強制Args手動提供。但我當然希望看到有人在這方面證明我錯了!
uj5u.com熱心網友回復:
您可以創建特征來提取回傳型別和引數。問題將是僅從函式宣告中處理 arity。
如果您可以包裝類/函子,則有可能:
template <auto func> struct wrapper_t;
template <typename Ret, typename ... Ts, Ret (*func)(Ts...)>
struct wrapper_t<func>
{
Ret operator() (Ts... args) const { return func(std::forward<Ts>(args)...); }
};
// handle ellipsis functions ala printf
template <typename Ret, typename ... Ts, Ret (*func)(Ts..., ...)>
struct wrapper_t<func>
{
template <typename ...EllipsisArgs>
Ret operator() (Ts... args, EllipsisArgs&&... ellipisisArgs) const {
return func(std::forward<Ts>(args)...,
std::forward<EllipsisArgs>(ellipisisArgs)...);
}
};
template <auto func>
constexpr wrapper_t<func> wrapper{};
演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/428015.html
下一篇:具有部分固定引數串列的c 模板
