考慮下面的代碼:在模板類:使用一個類方法,如模板參數另一類方法
template < class A >
class XX {
public:
template <int (*CC)() >
int bla(){ return CC(); }
int stam() {return 0;}
int f() {
return bla<stam>();
}
};
int main()
{
XX<int> xx;
printf(" this is %d\n", xx.f());
return 0;
}
它
test.cpp: In member function ‘int XX<A>::f() [with A = int]’:
test.cpp:14: instantiated from here
test.cpp:8: error: ‘int XX<A>::stam() [with A = int]’ cannot appear in a constant-expression**
失敗想着它很清楚之後。 stam
在模板實例化之前不存在,所以它沒有函數地址。當模板被實例化時,實例在代碼中的某個地方被解析,然後stam
得到一個地址。因此,地址在編譯時並不是一個常量(儘管可能有一些工作 - 但不支持)。
那麼,爲什麼我試圖做到這一點。我可以使用函數指針或虛函數。在使用stam
現實bla
(有stam1
和stam2
)稱這是數不勝數倍,即使是輕微的性能改進(如不使用間接)是值得歡迎的。
當然也有解決方案:創建bla1
和bla2
這幾乎是相同的。編寫一個預處理器宏。我想知道是否有一個優雅的解決方案。
即使模板由'XX xx'實例化,'stam'仍然不存在。 –
@ K-BALLO'XX xx'將實例化類用'A = int'並用它,它會實例'XX ::斯塔姆()'和'XX :: F()'。後者參考'XX :: bla <&XX :: stam>'這將實例化方法模板的實例。 –
@Tilman Vogel:不會,'stam'只會在直接或間接使用的情況下被實例化。 –