我試圖編譯以下代碼。
#include <iostream>
class Base
{
public:
template <typename T>
T fun()
{
std::cout<<"CALLED!"<<std::endl;
return T();
}
};
class Derived : public Base
{
};
template<class T>
T (Derived::*func_ptr)() = &Base::fun;
int main()
{
Derived d;
///how to call?
}
令我驚訝的是,它同時在 clang 和 gcc 中編譯。這給了我的想法,不知怎的,我們應該能夠呼叫fun的func_ptr。但是,我想不出通過這個指標呼叫函式的語法應該是什么。它的語法是什么,如何解釋?
還有一件事是,我想不出編譯的原因。C 標準中在哪里定義了這種行為?
uj5u.com熱心網友回復:
但是,我想不出通過這個指標呼叫函式的語法應該是什么。它的語法是什么?
(d.*func_ptr<int>)(); // or other template argument
它是如何解釋的?C 標準中在哪里定義了這種行為?
func_ptr是一個變數模板。標準中很少有專門關于變數模板的規則,但它們在 C 17 和更高版本的[temp.pre]第 1 和第 2 段中是允許的。
在你的定義中
template<class T>
T (Derived::*func_ptr)() = &Base::fun;
該運算式&Base::fun是一個指向多載函式的指標,如[over.over] 中所述。當func_ptr模板的每個特化被實體化時,它都有一個特定的函式指標型別T (*)()作為目標,并且Base::fun<T>可以從中推匯出正確的模板引數。
要使用變數模板,必須提供模板引數。(模板引數推導只能發生在函式模板和類模板上。)func_ptr<int>type 的運算式也是如此int (*)()。然后結合(obj.*mem)(args)呼叫成員函式指標的語法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/314642.html
上一篇:我們可以在沒有任何繼承的情況下在新創建的類中使用super方法嗎?
下一篇:使用繼承的類中的模板顯式特化
