為什麼這個奇怪的c++模板語法編譯成功?

拉胡爾

我最近遇到了這個與函數一起使用的 c++ weired 語法並成功編譯。我無法理解它,這到底是做什麼的。

“*member”如何沒有給我未定義的錯誤或其他東西,因為它沒有在其他任何地方聲明。

誰能告訴我如何調用這個函數?

template<class POS, class META>
size_t test11( META POS:: *member)
{
    /********/
} 

感謝大家。

林蛙

當你寫

META POS:: *member

這意味著它member是指向POS具有 type的類成員的指針META

現在來回答你的第二個問題,

誰能告訴我如何調用這個函數?

下面給出了一個可能的例子:

#include <iostream>
#include <string>
struct Name
{
    std::string name;
    
    Name() = default;
    Name(std::string pname): name(pname)
    {
        std::cout<<"Constructor called"<<std::endl;
    }
};

template<class POS, class META>
size_t test11( META POS:: *member)
{
    //create object of type Name
    Name n("Anoop");
    
    //create a pointer to object n
    Name *ptrN = &n;
    
    //Now let's use the variable member 
    std::cout<<ptrN->*member<<std::endl; 
    
    return 5;//don't forget to return something since the function has non-void return type
}
int main()
{
    //create a pointer to non-static member
    std::string Name::*ptrData = &Name::name; 
    
    //pass the pointer ptrData to the template function test11<>
    test11(ptrData);
    
    
}

程序的輸出是:

Constructor called
Anoop

可以在這裡驗證

解釋

當我寫

test11(ptrData);

在上面的代碼示例中,然後使用模板參數推導POS推導為類型NameMETA推導為類型std::string

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

NodeJS 在編譯時似乎運行了一個導出的函數——為什麼?

為什麼編譯器說這個宏函數需要一個右括號?

這個語法在 React Native 和 TypeScript 中是什麼意思?

為什麼這段帶有 Java 泛型的代碼不能編譯?

為什麼這個 if 語句沒有初始化或更新我的變量?

這個奇怪的路徑語法是什麼?

為什麼java編譯器不能識別for循環中變量的這個初始化?

為什麼要編譯?cout<"是";

為什麼 TypeScript 編譯器會通過兩個檢查來編譯它的可選鍊和空合併運算符?

為什麼我們可以在方法 map() 的這種用法中省略 return 語句

為什麼 Neovim 不突出整個語法?

為什麼這個 if/else 語句中的這些布爾表達式沒有按預期計算?

為什麼在這個 if 語句中執行“and not”?

為什麼這個c++模板需要參考?

我做了什麼來增強這個語句 select into 因為它需要太多時間來處理 2000 行?

不尋常的 switch 語句標籤 - 為什麼這不是語法錯誤?

為什麼 Spark 無法識別這種時間格式?

為什麼 ”!!” 不給編譯錯誤?

為什麼 Go 接受這種方法定義語法?

這個內聯彙編中的“%object”和“@object”是什麼意思?

這個阿拉伯語網頁的編碼方案是什麼?

什麼是 C++ 模板中的 `typename...` 語法?

為什麼這個 c 程序不能編譯階乘

為什麼這個zig程序由於“預期錯誤聯合類型,發現'錯誤:124:18'”而無法編譯?

C++ 結構和函數聲明。為什麼不編譯?

為什麼這個自定義反向函數的行為很奇怪?

為什麼會出現這些語法錯誤?

這個C語言語句是什麼意思?

為什麼接口中的這個箭頭函數不能編譯?