我對函式有疑問,更具體的是函式簽名以及如何傳遞它們。我可能是一個微不足道甚至愚蠢的問題,但我還找不到令人滿意的答案。
請考慮這個使用 astd::unique_ptr來管理檔案指標的示例:
#include <iostream>
#include <memory>
void func1(FILE* f)
{
std::cout << "func1 called" << std::endl;
fclose(f);
}
int main()
{
FILE* f = fopen("testfile.txt", "w");
if(f)
{
std::unique_ptr<FILE, void(*)(FILE*)> fptr(f, &func1);
}
return 0;
}
這種智能指標需要一個函式簽名作為第二個模板引數(shared_ptr不是出于某種奇怪的原因)。我目前對這里解釋簽名的理解是
void ( ) (FILE ) 是一個指向不回傳任何內容的函式的指標 (void) 和一個檔案指標作為引數。
結果,用戶必須使用地址運算子傳遞所需函式的地址。此時,出現了幾個問題:
1.) 洗掉地址運算子同樣有效,不會引發編譯器警告,代碼有效。這不應該是一個錯誤/警告嗎?
2.)如果我使用對函式的參考(例如unique_ptr<FILE, void(&)(FILE*)>(f, func1)),它會按預期作業,那么這是傳遞函式的一種更好的方式,因為它是明確的嗎?
3.) 完全洗掉中間說明符(例如unique_ptr<FILE, void()(FILE*)>(f, func1))會導致編譯器錯誤,那么按值傳遞函式通常是不可能的嗎?(如果是,那么通過將函式隱式轉換為函式指標來多載 1. 中的版本是有意義的)
uj5u.com熱心網友回復:
函式名是函式的總地址(指向函式的指標)。如果您想使用其他東西,您可以使用一些包裝器,例如 std::function:
#include <iostream>
#include <memory>
#include <functional>
class Closer {
public:
void operator ()(FILE *f) {
std::cout << "func1 called" << std::endl;
fclose(f);
}
};
int main()
{
FILE* f = fopen("testfile.txt", "w");
if(f)
{
std::unique_ptr<FILE, std::function<void(FILE*)>> fptr(f, Closer());
}
return 0;
}
在這種情況下,Lambda 是匿名功能物件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/425955.html
