我有一個相當大的專案,關于這個問題,我可以用 這個結構來總結:
void do_something()
{
//...
}
template<typename F> void use_funct(F funct)
{
// ...
funct();
}
int main()
{
// ...
use_funct(do_something);
}
一切正常,直到有人(我)決定重新格式化一些功能,將一些功能最小化,重寫 為這個最小的可重現示例:
void do_something(const int a, const int b)
{
//...
}
void do_something()
{
//...
do_something(1,2);
}
template<typename F> void use_funct(F funct)
{
// ...
funct();
}
int main()
{
// ...
use_funct(do_something);
}
現在代碼編譯時不會
出錯:沒有匹配的函式呼叫
whereuse_funct被實體化。
由于錯誤訊息對我來說不是很清楚并且更改很多,因此我浪費了大量時間來理解編譯器無法推斷出模板引數,因為do_something現在可以參考任何多載函式。
我洗掉了更改函式名稱的歧義,但我想知道將來是否有可能避免這個錯誤,而不依賴于模板引數推導。在這種情況下,我如何指定模板引數do_something(),可能不參考函式指標?我沒有絲毫明確表達的想法:
use_funct<-一個沒有引數的人->(do_something);
uj5u.com熱心網友回復:
您可以將函式包裝在 lambda 中,或者在將函式指標轉換為要呼叫的多載型別或顯式指定模板引數后傳遞函式指標:
use_funct([](){ do_something (); });
use_funct(static_cast<void(*)()>(do_something));
use_funct<void()>(do_something);
將其包裝在 lambda 中的優點是可以將多載決議推遲到use_func. 例如:
void do_something(int) {}
void do_something(double) {}
template<typename F> void use_funct(F funct) {
funct(1); // calls do_something(int)
funct(1.0); // calls do_something(double)
}
int main() {
use_funct([](auto x){ do_something (x); });
}
[...] 可能沒有參考函式指標?
我不確定您的意思或為什么要避免這種情況。void()是函式的型別,而不是函式指標。如果您關心拼寫型別,可以使用別名:
using func_type = void();
use_funct<func_type>(do_something);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/435658.html
