給定以下簡單的包裝器結構(受此答案啟發):
template <auto* F> struct Wrapper;
template <class Ret, class... Args, auto (*F)(Args...) -> Ret>
struct Wrapper<F>
{
auto operator()(Args... args) const
{
return F(args...);
}
};
以下作品:
int this_works(){
return 42;
}
int main(){
return Wrapper<this_works>()();
}
但我想要這個,使用 c 20:
int main(){
return Wrapper<[](){return 42;}>()();
}
g -11 --std=c 20并且clang 13 --std=c 20都抱怨后者有一些難以破譯的錯誤資訊,包括:
- 不匹配的型別 'auto*' 和 'main()::<lambda()>
- 錯誤:型別為“auto *”的非型別模板引數“F”具有不兼容的初始化程式
有沒有辦法讓第二個例子作業?我嘗試了一個指向 lambda 的 constexpr 函式指標,但它抱怨它沒有鏈接......
uj5u.com熱心網友回復:
Wrapper需要函式指標,但模板引數推導不會考慮隱式轉換(從沒有捕獲的 lambda 到函式指標)。
您可以將 lambda 顯式轉換為函式指標:
int main(){
return Wrapper<static_cast<int(*)()>([](){return 42;})>()();
}
或者
int main(){
return Wrapper< [](){return 42;}>()();
}
居住
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/467040.html
上一篇:專門模板函式回傳向量
